我知道,一般来说,使用反射会带来性能影响。 (我本人不是反射的粉丝可言,其实,这是一个纯粹的学术问题。)你能从MethodInfo对象中得到一个Func <T>(或类似的)吗?
假设存在某个类,看起来像这样:这里
public class MyClass {
public string GetName() {
return "My Name";
}
}
包涵。我知道如果我有一个名为x
的MyClass
实例,我可以拨打x.GetName()
。此外,我可以将Func<string>
变量设置为x.GetName
。
现在,这是我的问题。比方说我不知道知道上面的类叫做MyClass
;我有一些对象,x
,但我不知道它是什么。我可以检查,看看是否该对象是否具有GetName
方法,通过这样做:
MethodInfo getName = x.GetType().GetMethod("GetName");
假设getName
不为空。那么我不能再进一步检查getName.ReturnType == typeof(string)
和getName.GetParameters().Length == 0
,在这一点上,我不能肯定我的getName
对象所代表的方法可能肯定以某种方式被转换为Func<string>
?
我知道有一个MethodInfo.Invoke
,我也知道我可以一直创建一个Func<string>
,如:
Func<string> getNameFunc =() => getName.Invoke(x, null);
我猜我问的是,如果有任何的路要走从一个MethodInfo
对象到它所代表的实际方法,在处理中产生反射的性能代价,但在之后那个点能够呼叫我(通过例如Func<string>
或类似的东西)而没有性能损失。
什么我预想可能看起来是这样的:(我认识到,不存在;我不知道是否有什么像吧)
// obviously this would throw an exception if GetActualInstanceMethod returned
// something that couldn't be cast to a Func<string>
Func<string> getNameFunc = (Func<string>)getName.GetActualInstanceMethod(x);
关于你在编辑中的评论 - 你会看到一个巨大的速度增加与解决方案,如thi s,因为动态编译的委托和静态编译的委托没有什么区别;一旦编制的开销被分解出来。因为我发现了表达树的东西,所以我一直在使用它们,并且很可能将它作为我的第一个.Net 3.5特性。在第4版中,它更好,因为您可以编写多语句代码 - 因为DLR所需的扩展名所需。 – 2010-05-30 18:02:48