System.Reflection.RuntimeReflectionExtensions中的方法的目的是什么?

14

自 .NET 4.5(2012)以来,一些新的扩展方法出现了,来自 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)meth2检查引用相等性,也会得到True。)

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


我也不知道为什么存在这些方法,因为在内部,GetRuntimeProperty 只是执行与 type.GetProperty(name) 相同的方法。 - Sergey Litvinov
我看不出有任何意义。这完全是多余的。如果你查看反编译的代码,你会看到它们是多么无意义。猜想当时可能有人在编码时睡着了。 - leppie
2
需要添加此内容以支持WinRT。它是基于COM的,不支持反射。许多怪癖都被语言投影隐藏在CLR中,以隐藏基本类型系统。没有什么非常微妙的地方,在WinRT中,字符串是一种非常不同的类型。但它并不完美,不确定他们如何模拟它。 - Hans Passant
1
@HansPassant:为什么不通过“原始”位置提供功能呢?或者这些属性/方法一开始就不存在吗?如果是这样,那么请参见第一个问题! - leppie
4
不确定“原始”位置可能是什么。 Sergey的观察并不准确,这只适用于.NET桌面版本。如果你的目标是WinRT,那么你将使用完全不同的一组参考程序集。这些程序集使用[TypeForwardedTo]技巧来将类型重新映射到完全不同的实现。类似这样的东西,挖掘这需要我生命中数小时的时间,可能会在无法访问源代码的内部QCall函数上遇到障碍。请放心,当他们做这件事时没有人在睡觉。 - Hans Passant
1个回答

1

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

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


2
这些扩展方法对于什么有用呢?谁会使用这些扩展方法,谁会使用System.Type等上的“旧”实例成员?如果WinRT由于其类型系统需要特殊行为,为什么它不提供Type.GetProperties(BindingFlags)抽象方法的特殊重写等呢?如果他们愿意,他们也可以以不同的方式实现非虚拟成员。简而言之,我看不出这些扩展有什么用处。踩一下。 - Jeppe Stig Nielsen
3
我查看了System.Type文档,在“版本信息”下包括*.NET for Windows Store应用程序。如果我查看像GetPropertyImplGetProperties(BindingFlags)这样的abstract方法,它们在.NET for Windows Store应用程序*中不存在。那么为什么他们不直接在System.Type中包含所需的实例方法,而要创建扩展方法呢? - Jeppe Stig Nielsen
这可能是为了确保向后兼容而制定的严格规则。以下是两个可能的冲突:1)一个具有自己的GetRuntimeField扩展方法的代码,用于Type,2)一个反映Type并依赖其成员排序的代码。 - Victor Victis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接