我正在同时为桌面,Windows 8商店和Windows Phone构建新的应用程序。因此,我创建了可移植类库以在所有平台上具有通用功能。我的问题是,当我尝试在PCL中重用我的代码时,无法访问库中的某些方法和属性。根据MSDN,支持这些方法,但是我现在知道为什么我无法访问它们。
var property = memberExpression.Member as PropertyInfo;
if (property == null)
{
}
var getMethod = property.GetGetMethod(true);
if (getMethod.IsStatic)
{}
这是无法编译的代码片段。在Visual Studio编辑器中,GetGetMethod和IsStatic为红色。我不知道为什么会这样,以及如何访问这些属性。
因此,如果外面有人曾经做过类似的事情,请帮助我编译此代码。
最佳答案
我们在Windows Store应用程序的.NET的反射API中进行了一些重构。有关详细信息,请参见博客文章Evolving the Reflection API。除其他事项外,API的更改使我们为将来更好的可移植性做好了准备。 Windows Store应用程序,.NET 4.5和Windows Phone 8中提供了新的API。出于兼容性的考虑,.NET 4.5和Windows Phone 8中当然仍然可以使用旧的API。
对于可移植类库,如果仅针对支持新的反射API的平台,那么您将仅获得新的API。如果添加不支持新API的平台,则将获得API。PropertyInfo.GetGetMethod()
不是新API的一部分,因此您应该改用PropertyInfo.GetMethod
。 MethodInfo.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)
{}
关于c# - 可移植类库和反射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14061291/