none
請問Reflection動態產生程式碼問題 RRS feed

  • 問題

  • 請問一個關於Reflection動態產生程式碼的問題
    我有一個如下的class想改寫成動態產生程式碼,但是遇到點問題,找尋不到寫法
    該如何在產生的組件Property參考到 m_XN.Attributes["id"].Value:
        class MyItem
        {
            private XmlNode m_XN;
    
            public MyItem(XmlNode XN)
            {
                m_XN = XN;
            }
    
            public String ID
            {
                get { return m_XN.Attributes["id"].Value; }
                set { m_XN.Attributes["id"].Value = value; }
            }
        }
    
    改寫後如下:
        class Example
        {
            public static Type Demo()
    
            {
    
    
                AssemblyName aName = new AssemblyName("DynamicAssemblyExample");
                AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Run);
    
                ModuleBuilder mb = ab.DefineDynamicModule(aName.Name);
    
                TypeBuilder tb = mb.DefineType("MyDynamicType", TypeAttributes.Public);
    
                FieldBuilder fbNumber = tb.DefineField("m_XN", typeof(XmlNode), FieldAttributes.Private);
     
                Type[] parameterTypes = { typeof(XmlNode) };
                ConstructorBuilder ctor1 = tb.DefineConstructor(
                    MethodAttributes.Public,
                    CallingConventions.Standard,
                    parameterTypes);
    
                ILGenerator ctor1IL = ctor1.GetILGenerator();
     
                ctor1IL.Emit(OpCodes.Ldarg_0);
                ctor1IL.Emit(OpCodes.Call,
                    typeof(object).GetConstructor(Type.EmptyTypes));
                ctor1IL.Emit(OpCodes.Ldarg_0);
                ctor1IL.Emit(OpCodes.Ldarg_1);
                ctor1IL.Emit(OpCodes.Stfld, fbNumber);
                ctor1IL.Emit(OpCodes.Ret);
    
                PropertyBuilder pbNumber = tb.DefineProperty(
                    "ID",
                    PropertyAttributes.HasDefault,
                    typeof(string),
                    null);
    
                MethodAttributes getSetAttr = MethodAttributes.Public |
                    MethodAttributes.SpecialName | MethodAttributes.HideBySig;
    
                MethodBuilder mbNumberGetAccessor = tb.DefineMethod(
                    "get_ID",
                    getSetAttr,
                    typeof(string),
                    Type.EmptyTypes);
    
                ILGenerator numberGetIL = mbNumberGetAccessor.GetILGenerator();
    
                numberGetIL.Emit(OpCodes.Ldarg_0);
                numberGetIL.Emit(OpCodes.Ldfld, fbNumber);//此處錯誤,如何Get m_XN.Attributes["id"].Value
                numberGetIL.Emit(OpCodes.Ret);
    
                MethodBuilder mbNumberSetAccessor = tb.DefineMethod(
                    "set_ID",
                    getSetAttr,
                    null,
                    new Type[] { typeof(string) });
    
                ILGenerator numberSetIL = mbNumberSetAccessor.GetILGenerator();
    
                numberSetIL.Emit(OpCodes.Ldarg_0);
                numberSetIL.Emit(OpCodes.Ldarg_1);
                numberSetIL.Emit(OpCodes.Stfld, fbNumber);//此處錯誤,如何Set m_XN.Attributes["id"].Value
                numberSetIL.Emit(OpCodes.Ret);
     
                pbNumber.SetGetMethod(mbNumberGetAccessor);
                pbNumber.SetSetMethod(mbNumberSetAccessor);
    
                // Finish the type.
                Type t = tb.CreateType();
    
                return t;
            }
        }
    遇到點瓶頸,請了解的人幫忙指點一下,謝謝!
    2009年6月11日 上午 02:19

所有回覆

  • Hi,

    根據id的可能值, 您宣告可以試看看改成這樣:
    FieldBuilder fbNumber = tb.DefineField("m_XN", typeof(String), FieldAttributes.Private);

    or

    FieldBuilder fbNumber = tb.DefineField("m_XN", typeof(Int), FieldAttributes.Private);



    微軟技術支援中心(CSS) - http://www.dotblogs.com.tw/lolota/
    2009年6月11日 上午 02:41
  • 感謝回答哩,可是跟我要的結果好像不一樣,
    我原本設計的class 是在constructor傳入 一個XmlNode
    然後Property是Get,Set 傳入的XmlNode某個 Attribute;

    如果是直接將m_XN改成int或是string型態
    就不是我要的結果了...
    2009年6月11日 上午 02:48