using System; using System.CodeDom; using System.Reflection; namespace Chernobyl.Reflection.Template.CodeDom { /// /// An that can take any /// instance that represents a field and generate CodeDom for it. /// public class CodeDomField : CodeDomAssignableMember { /// /// Initializes a new instance of the class. /// /// The instance to /// generate CodeDom for and provide the /// implementation for this class. /// Thrown if the member is not /// a field. In other words, the /// on the is not equal to /// . public CodeDomField(IMember member) : base(member) { if (Info.MemberType != MemberTypes.Field) throw new ArgumentException("The member must be a field.", "member"); } /// /// The reference to the assignable member as a code expression. This /// reference will be used to generate code that can set the member. /// The reference to the property assumes the target object is /// . /// public override CodeExpression AssignableMemberReference { get { return _assignableMemberReference; } } /// /// Initializes the . /// Note to implementers: Base classes should invoke the base class /// method when their /// is initialized. /// protected override void Configure() { // note that we don't configure the AssignableMemberReference if our // Parent is not set to a CodeDomInstance because the property // TheGenericInstancePropertyReference uses the CodeDomInstance // Parent reference to generate the required code. if (Parent != null && Parent is CodeDomInstance && _assignableMemberReference == null) { _assignableMemberReference = new CodeFieldReferenceExpression(TheGenericInstancePropertyReference, Name); base.Configure(); } } /// /// The backing field to . /// CodeExpression _assignableMemberReference; } }