便携式类库和reflection

我正在为Desktop,Windows 8商店和Windows手机同时构建新的应用程序。 所以我创建了可移植类库,以便在所有平台上具有通用function。 我的问题是,当我尝试在PCL中重用我的代码时,我无法访问库中的一些方法和属性。 根据MSDN,支持这些方法,但我现在知道为什么我无法访问它们。

var property = memberExpression.Member as PropertyInfo; if (property == null) { } var getMethod = property.GetGetMethod(true); if (getMethod.IsStatic) {} 

这是无法编译的代码片段。 GetGetMethod和IsStatic在Visual Studio编辑器中是红色的。 我不知道为什么会发生这种情况以及如何访问这些属性。

所以,如果那里的任何人做过类似的事情,请帮我编译这段代码。

我们在.NET for Windows Store应用程序的reflectionAPI中进行了一些重构。 有关详细信息,请参阅博客文章Evolving the Reflection API 。 除此之外,API的变化为我们提供了更好的可移植性。 新的API在Windowsapp store应用程序,.NET 4.5和Windows Phone 8中可用。为了兼容性,旧的API当然仍然可以在.NET 4.5和Windows Phone 8上使用。

对于可移植类库,如果您定位支持新reflectionAPI的平台,那么您将只获得新的API。 如果添加不支持新API的平台,那么您将获得API。

PropertyInfo.GetGetMethod()不是新API的一部分,因此您应该使用PropertyInfo.GetMethodMethodInfo.IsStatic是新API的一部分,你在Visual Studio中看到红色曲线的原因是因为它不知道getMethod是什么类型,因为你使用了var而GetGetMethod()无法被识别。

所以,你的代码应该是这样的:

  var property = memberExpression.Member as PropertyInfo; if (property == null) { } var getMethod = property.GetMethod; if (getMethod != null && getMethod.IsStatic) {} 

要提供有关我的评论的一些信息,请使用Type.GetMethod

来自Type的元数据

在评估从System.Type方法和属性返回的元数据时,相等运算符可能会在不同平台上返回不同的结果。 在.NET Compact Framework中,每次对Type.GetMethod方法的连续调用都会返回System.Reflection.MethodInfo的新实例,因此返回值永远不会被评估为相等。 但是,在.NET Framework 4中,使用相同的参数调用GetMethod返回MethodInfo的相同实例。 在使用以下System.Reflection类型时,必须检查并可能修改代码: MethodInfoFieldInfoPropertyInfoEventInfoMemberInfoMethodBaseConstructorInfoParameterInfo

关于开放generics类型的思考

在Windows Phone 7上,封闭的generics类型支持reflection; 但是,开放generics类型不支持大多数reflection操作。 在打开的generics类型上,Windows Phone 7仅支持以下reflection操作:通过调用GetTypeGetMethods方法检索打开的generics类型或方法。 通过调用MakeGenericTypeMakeGenericMethod方法从开放generics类型或方法创建generics类型或方法。 对于打开generics类型的所有其他reflection操作,将引发NotSupportedExceptionexception。

来源: http : //msdn.microsoft.com/en-us/library/gg597392.aspx