• <button id="ywcoc"><input id="ywcoc"></input></button>
  • <object id="ywcoc"><blockquote id="ywcoc"></blockquote></object>
    <table id="ywcoc"></table>
  • 技術資料
    C#動態創建和動態使用程序集、類、方法、字段等(二)
    時間:2016-06-28 15:06:17     點擊數:3277 次
     上一節講了如何動態的創建,這一節就要講創建了我們需要如何使用了,這當然也是非常重要的, 是吧。創建了動態類型但是又不使用,那創建它有什么用了。呵呵,今天我們就來一起學習動態使用動態創建的類型。

    當然我們跟上一章一樣要對這些動態類型的使用類型進行一些了解。


    類:使用System.Type(任何時候都是反射出類型進行使用,難道不是嗎?)


    構造函數:System.Reflection.ConstructorInfo(發現類構造函數的屬性并提供對構造函數元數據的訪問權)思馳科技


    事件:System.Reflection.EventInfo(發現事件的屬性并提供對事件元數據的訪問權)


    字段:System.Reflection.FieldInfo(發現字段屬性并提供對字段元數據的訪問權)


    方法:System.Reflection.MemberInfo(獲取有關成員屬性的信息并提供對成員元數據的訪問)


    成員:System.Reflection.MemberInfo(獲取有關成員屬性的信息并提供對成員元數據的訪問)


    參數:System.Reflection.ParameterInfo(發現參數屬性并提供對參數元數據的訪問)


    屬性:System.Reflection.PropertyInfo (發現屬性 (Property) 的屬性 (Attribute) 并提供對屬性 (Property) 元數據的訪問)


    同樣這是一種延伸閱讀,只是先對這些進行了解,如果不知道的話,可能對動態的使用類型就無法下手了。


    今天我做了一個Demo,先上Demo吧,然后在來解釋程序是如何執行的。


    /動態創建的動態類型



    public static Type DynamicCreateType()

    {

    //動態創建程序集

    AssemblyName DemoName = new AssemblyName("DynamicAssembly");

    AssemblyBuilder dynamicAssembly
    = AppDomain.CurrentDomain.DefineDynamicAssembly(DemoName, AssemblyBuilderAccess.RunAndSave);

    //動態創建模塊

    ModuleBuilder mb = dynamicAssembly.DefineDynamicModule(DemoName.Name, DemoName.Name + ".dll");

    //動態創建類MyClass

    TypeBuilder tb = mb.DefineType("MyClass", TypeAttributes.Public);

    //動態創建字段

    FieldBuilder fb = tb.DefineField("myField", typeof(System.String), FieldAttributes.Private);

    //動態創建構造函數

    Type[] clorType = new Type[] { typeof(System.String) };

    ConstructorBuilder cb1
    = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, clorType);

    //生成指令

    ILGenerator ilg = cb1.GetILGenerator();//生成 Microsoft 中間語言 (MSIL) 指令

    ilg.Emit(OpCodes.Ldarg_0);

    ilg.Emit(OpCodes.Call,
    typeof(object).GetConstructor(Type.EmptyTypes));

    ilg.Emit(OpCodes.Ldarg_0);

    ilg.Emit(OpCodes.Ldarg_1);

    ilg.Emit(OpCodes.Stfld, fb);

    ilg.Emit(OpCodes.Ret);

    //動態創建屬性

    PropertyBuilder pb = tb.DefineProperty("MyProperty", PropertyAttributes.HasDefault, typeof(string), null);

    //動態創建方法

    MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName;

    MethodBuilder myMethod
    = tb.DefineMethod("get_Field", getSetAttr, typeof(string), Type.EmptyTypes);

    //生成指令

    ILGenerator numberGetIL = myMethod.GetILGenerator();

    numberGetIL.Emit(OpCodes.Ldarg_0);

    numberGetIL.Emit(OpCodes.Ldfld, fb);

    numberGetIL.Emit(OpCodes.Ret);

    //使用動態類創建類型

    Type classType = tb.CreateType();

    //保存動態創建的程序集 (程序集將保存在程序目錄下調試時就在Debug下)

    dynamicAssembly.Save(DemoName.Name + ".dll");

    //創建類

    return classType;

    }




    執行的主要方法



    static void Main(string[] args)

    {

    //動態創建的類類型

    Type classType = DynamicCreateType();

    //調用有參數的構造函數

    Type[] ciParamsTypes = new Type[] { typeof(string) };

    object[] ciParamsValues = new object[] { "Hello World" };

    ConstructorInfo ci
    = classType.GetConstructor(ciParamsTypes);

    object Vector = ci.Invoke(ciParamsValues);

    //調用方法

    object[] methedParams=new object[]{};

    Console.WriteLine(classType.InvokeMember(
    "get_Property", BindingFlags.InvokeMethod, null, Vector, methedParams));

    Console.ReadKey();

    }



    這個程序首先調用DynamicCreateType()方法創建動態類型,這跟第一章里帖出來的如何創建的代碼幾乎是一樣的,另外保存了動態創建的程序集,我創建了一個類,類里創建了有一個字段、有一個參數的構造函數、一個屬性、有一個參數的構造函數和一個方法。用有參數的構造函數來初始化字段myField,然后調用get_Field方法返回myField字段的值??刂婆_程序顯示“Hello World!!!”


    后面還會繼續介紹動態創建和動態使用類,如何創建復雜的方法,特別是中間語言(MSIL)的生成。


    第一篇:C# 動態創建和動態使用程序集、類、方法、字段等(一)


    DEMO下載

    Tag標簽: .net,C#
    轉到頁頭】【返回
  • <button id="ywcoc"><input id="ywcoc"></input></button>
  • <object id="ywcoc"><blockquote id="ywcoc"></blockquote></object>
    <table id="ywcoc"></table>
  • 精品一区二区国产在线观看_高h猛烈失禁潮喷a片在线播放_青青国产成人久久111网站_日本免费a片一区二区三区四区