小编Dan*_*bel的帖子

如何使用Reflection.emit在运行时创建方法

我在运行时使用反射发射创建一个对象.我成功创建了字段,属性和获取设置方法.现在我想添加一个方法.为简单起见,我们假设该方法只返回一个随机数.如何定义方法体?

编辑:

是的,我一直在查看msdn文档以及其他参考文献,我开始对这些东西感兴趣.我看到上面的例子是如何添加和/或多重,但是如果我的方法正在做其他事情该怎么办.我如何定义"东西"假设我动态生成下面的类,我将如何创建GetDetails()方法的主体?

class TestClass
{
    public string Name  { get; set; }
    public int Size  { get; set; }

    public TestClass()
    {
    }

    public TestClass(string Name, int Size)
    {
        this.Name = Name;
        this.Size = Size;
    }

    public string GetDetails()
    {
        string Details = "Name = " + this.Name + ", Size = " + this.Size.ToString();
        return Details;
    }
}
Run Code Online (Sandbox Code Playgroud)

reflection.emit c#-4.0

9
推荐指数
1
解决办法
1万
查看次数

使用Reflection.Emit实现INotifyPropertyChanged

使用C#/ .Net 4.0,我将数据存储在BindingList中,其中dataRow是在运行时通过Reflection.Emit定义的.(传入数据的结构各不相同,由外部源定义.)在我第一次涉足反射和IL的世界之后,我已经能够创建我的dataRow用值填充它,填充我的BindingList和在网格中显示结果.我现在正在尝试在对数据进行更改时实现INotifyPropertyChanged接口和PropertyChangedEventHandler.用这个作为指南,我已经运行了代码,但似乎没有出现RaisePropertyChanged事件正在触发或它只是没有做任何事情.当我通过ildasm.exe将我的动态版本与普通/静态版本进行比较时,我发现remove_PropertyChanged和add_PropertyChanged方法存在重大差异.任何人都可以提供一些通过反射实现INotifyPropertyChanged接口的技巧或示例.

经过进一步检查后,似乎事件字段必须为null,因此不会调用PropertyChangedEventHandler.我在RaiseProprtyChanged方法构建器中添加了一些消息框,我发现if(PropertyChanged!= null)的等价物返回零/ false,因此没有任何反应.如果我将OpCodes.Brtrue更改为OpCodes.Brfalse,我会得到一个"对象引用未设置为对象的实例"消息.感觉我错过了一些简单的东西,但我找不到它.

            //implement IINotifyPropertyChanged interface
        tb.AddInterfaceImplementation(typeof(INotifyPropertyChanged));

        //property changed event handler
        FieldBuilder eventField = tb.DefineField("PropertyChanged", typeof(PropertyChangedEventHandler), FieldAttributes.Private);

        EventBuilder eb = tb.DefineEvent("PropertyChanged", EventAttributes.None, typeof(PropertyChangedEventHandler));

        MethodBuilder mbEV = tb.DefineMethod("remove_PropertyChanged", MethodAttributes.Public |
            MethodAttributes.SpecialName | MethodAttributes.NewSlot |
            MethodAttributes.HideBySig | MethodAttributes.Virtual |
            MethodAttributes.Final, null, new[] { typeof(PropertyChangedEventHandler) });

        MethodImplAttributes eventMethodFlags = MethodImplAttributes.Managed; //| MethodImplAttributes.Synchronized;
        mbEV.SetImplementationFlags(eventMethodFlags);
        il = mbEV.GetILGenerator();
        il.Emit(OpCodes.Ldarg_0);
        il.Emit(OpCodes.Ldarg_0);
        il.Emit(OpCodes.Ldfld, eventField);
        il.Emit(OpCodes.Ldarg_1);
        il.EmitCall(OpCodes.Call, typeof(Delegate).GetMethod("Remove", new[] { typeof(Delegate), typeof(Delegate) }), null);
        il.Emit(OpCodes.Castclass, typeof(PropertyChangedEventHandler));
        il.Emit(OpCodes.Stfld, eventField);
        il.Emit(OpCodes.Ret);
        MethodInfo miRemoveEvent …
Run Code Online (Sandbox Code Playgroud)

c# reflection inotifypropertychanged

5
推荐指数
1
解决办法
2801
查看次数

动态创建类型的性能

使用C#,我注意到在使用动态生成类型的实例与简单结构填充列表时性能的显着差异.下面的代码包括4种不同的方法,用于填充包含100,000个对象的列表.

每种方法的表现不同:

Button1:15毫秒

Button2:31毫秒

Button3&4:300毫秒

请注意,按钮3和4的代码来自此主题

谁能解释为什么动态创建的对象更慢?

    public struct DataRow
    {
        public double t;
        public double vf;
        public double im;

        public double T { get { return t; } set { t = value; } }
        public double Vf { get { return vf; } set { vf = value; } }
        public double Im { get { return im; } set { im = value; } }
    }

    //Use struct defined above
    private void button1_Click(object sender, EventArgs e) …
Run Code Online (Sandbox Code Playgroud)

c# generics reflection.emit

1
推荐指数
1
解决办法
2169
查看次数