2014-03-19 46 views
11

自.NET 4.5(2012)以来,一些新的扩展方法出现,从System.Reflection.RuntimeReflectionExtensions class。但是,新方法似乎没有给我们任何新的东西。举例:System.Reflection.RuntimeReflectionExtensions中方法的用途是什么?

static void Main() 
{ 
    var prop1 = typeof(string).GetProperty("Length"); 
    var prop2 = typeof(string).GetRuntimeProperty("Length"); // extension, needs: using System.Reflection; 
    Console.WriteLine(prop1 == prop2); 

    Action a = Main; 
    var meth1 = a.Method; 
    var meth2 = a.GetMethodInfo(); // extension, needs: using System.Reflection; 
    Console.WriteLine(meth1 == meth2); 
} 

这写两次True

(该==运算符重载在这里,但即使(object)prop1 == (object)prop2检查参考平等和(object)meth1 == (object)meth2True)。

那么这些新公开可见方法的目的是什么?很显然,我必须忽略或误解某些东西。

+0

我也不知道为什么这些方法是存在的,因为内部'GetRuntimeProperty'只是执行相同的'type.GetProperty(name)'方法 –

+0

我看不到任何目的。它是完全多余的。如果你看看反编译的代码,你会看到他们是多么毫无意义。猜猜有人在进入代码库的那一天睡着了。 – leppie

+1

这需要添加以支持WinRT。这是基于COM的,它不支持反射。 CLR内置的语言投影掩盖了许多怪癖,隐藏了基本类型系统。没有什么非常微妙的,在WinRT中,一个字符串是*非常*不同的类型。但它并不完美,不完全确定它们是如何效仿它的。 –

回答

1

GetRuntime *方法用于WinRT项目。由于WinRT使用的类型可能与.NET使用的类型不同,但功能相同且名称相同,因此这些反射方法可确保返回正确的MemberInfo。如果您运行的是WinRT,则在运行时不需要.NET MemberInfo。

请参阅Hans Passant对原始问题的评论。

+2

这些扩展方法如何对此有用?谁会使用这些扩展方法,谁会在'System.Type'等中使用“旧”实例成员?如果WinRT由于其类型系统而需要特殊行为,为什么它不提供'Type.GetProperties(BindingFlags)'抽象方法的特殊覆盖,等等?如果他们愿意,他们也可以以不同的方式实现非虚拟成员。总之,我看不出扩展是如何有用的。 Downvoting。 –

+2

如果我查看“版本信息”下的['System.Type'文档](http://msdn.microsoft.com/zh-cn/library/system.type.aspx),它确实包含* .NET for Windows存储应用*。如果我查看像''GetPropertyImpl''(http://msdn.microsoft.com/en-us/library/system.type.getpropertyimpl.aspx)或['GetProperties(BindingFlags)'](http ://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx),它们不存在于Windows应用商店*的.NET中。那么为什么他们不只是在'System.Type'中包含他们需要的实例方法,而不是创建扩展? –

+0

确保向后兼容性可能是严格的规则。这里有两种可能的冲突:1)代码有自己的GetRuntimeField扩展方法; 2)代码可以反映类型并依赖于它的成员排序。 –

相关问题