如何使用反射创建高性能.NET类?

Rai*_*ord 10 .net c# reflection

好的,所以我们都知道Reflecttion的性能要比"newing"类实例少得多,而且在很多情况下,根据应用程序的要求,这很好.

问题:我们如何使用后期绑定(反射)策略创建高性能.NET类.

我有一个现有的要求,即要求使用反射(CreateInstance)创建类实例,但性能至关重要.在我的情况下,我正在为我们的应用程序中的每个传入SMS消息创建实例.在生产过程中,每天可以轻松超过一百万.

我想听听并分享一些关于如何创建.NET类而不直接引用代码中的类的想法,例如使用Reflection.我还在想是否有办法以某种方式缓存一个可以改善"创建"时间的类Factory

Mar*_*ell 12

每天100万并不是很多; 我只是使用Activator.CreateInstance(使用Activator.CreatInstance(Type)显示器进行快速测试,在我的低端笔记本电脑上,它可以Type在~2秒内创建1M对象).

关于快速创建对象的想法:

  • 使用泛型和: new()约束(零努力)
  • 使用DynamicMethod和写入IL(不是很难)

的的实现new方法(而不需要: new()约束外)如下所示:ObjectFactory.cs.

有关IL示例,请参阅dapper-dot-netil.Emit(OpCodes.Newobj, ...)

  • @jerry - 我的秒表告诉我,对不起.从通用的新版本来看,我的表现总是稍微差一点(慢5-8倍).如果您查看ildasm,通用代码将调用Activator.CreateInstance <T>. (2认同)

Meh*_*ari 6

对于简单的反思调用,我不认为每天有一百万.我相信你过度优化了,但无论如何,正如你所说,只需使用一个Activator.CreateInstance调用创建一个工厂类并缓存那个.将使用CreateInstance()返回对象上的方法调用创建实际实例.

public interface IClassFactory {
    IClass CreateInstance();
}

public interface IClass {
   // your actual class interface.
}

public class DefaultClassFactory : IClassFactory {
    public IClass CreateInstance() {
        return new DefaultClass(); // the implementation class
    }
}
Run Code Online (Sandbox Code Playgroud)

在某个地方,你将拥有一个static类型的字段IClassFactory,你可以使用DefaultClassFactory配置文件中指定的任何其他类的实例设置一次.


Joh*_*ers 5

一些想法:

  • 一旦发现需要,就保持每个班级的一个实例.然后,而不是CreateInstance,克隆它.
  • 创建第一个实例后,请保留实例的类型.然后使用Activator.CreateInstance(Type)

高速缓存中的实例克隆或在类型Dictionary<string,Type>Dictionary<string,object>.


Dan*_*ard 5

通常情况下,Jon Skeet是你的朋友.看他的博客文章Make reflection fly和探索代表