C# 可移植类库与反射
我正在为桌面、Windows8商店和WindowsPhone同时构建新的应用程序。所以我创建了可移植类库,以便在所有平台上都具有通用功能。我的问题是,当我试图在PCL中重用代码时,我无法访问库中的某些方法和属性。根据MSDN,这些方法是受支持的,但我现在知道为什么我不能访问它们C# 可移植类库与反射,c#,reflection,portable-class-library,C#,Reflection,Portable Class Library,我正在为桌面、Windows8商店和WindowsPhone同时构建新的应用程序。所以我创建了可移植类库,以便在所有平台上都具有通用功能。我的问题是,当我试图在PCL中重用代码时,我无法访问库中的某些方法和属性。根据MSDN,这些方法是受支持的,但我现在知道为什么我不能访问它们 var property = memberExpression.Member as PropertyInfo; if (property == null) {
var property = memberExpression.Member as PropertyInfo;
if (property == null)
{
}
var getMethod = property.GetGetMethod(true);
if (getMethod.IsStatic)
{}
下面是无法编译的代码片段。在VisualStudio编辑器中,GetMethod和IsStatic以红色显示。我不知道为什么会发生这种情况,以及如何访问这些属性
因此,如果有人做过类似的事情,请帮助我编译这段代码。要提供有关我的评论的信息,请使用Type.GetMethod 来自类型的元数据 评估从
系统返回的元数据时。键入方法和
属性时,相等运算符可能返回不同的结果
不同的平台。在.NET Compact Framework中,每个
调用Type.GetMethod
方法返回
System.Reflection.MethodInfo
,因此返回值永远不会作为
平等。但是,在.NET Framework 4中,使用
相同参数返回MethodInfo的相同实例。你必须
使用时,请检查并可能修改代码
以下系统.反射类型:MethodInfo
,FieldInfo
,
属性信息
,事件信息
,成员信息
,方法库
,构造函数信息
,以及
参数信息
对开放泛型类型的反思
在Windows Phone 7上,关闭的泛型类型支持反射;
但是,大多数反射操作在open generic上不受支持
类型。在打开泛型类型上,仅执行以下反射操作
Windows Phone 7支持:检索打开的泛型类型或
方法调用GetType
或GetMethods
方法。创建泛型
通过调用
MakeGenericType
或MakeGenericMethod
方法。所有其他的思考
对打开的泛型类型执行操作时,会出现NotSupportedException
异常
扔
来源:我们在Windows应用商店应用程序的.NET反射API中进行了一些重构。有关详细信息,请参阅博客文章。除此之外,API的变化为我们将来提供了更好的可移植性。新的API在Windows应用商店应用程序、.NET 4.5和Windows Phone 8中提供。为了兼容性,旧的API当然在.NET4.5和WindowsPhone8上仍然可用
对于可移植类库,如果您只针对支持新反射API的平台,那么您将只获得新API。如果您添加了一个不支持新API的平台,那么您将获得这些API
PropertyInfo.GetMethod()
不是新API的一部分,因此应该改用PropertyInfo.GetMethod
MethodInfo.IsStatic
是新API的一部分,您在Visual Studio中看到红色曲线的原因是因为它不知道getMethod是什么类型,因为您使用了var
并且getMethod()未被识别
因此,您的代码应该如下所示:
var property = memberExpression.Member as PropertyInfo;
if (property == null)
{
}
var getMethod = property.GetMethod;
if (getMethod != null && getMethod.IsStatic)
{}
使用Type.GetMethod调试器的意思是什么?GetMethod和GetMethod是两个不同的东西,那么为什么我要使用GetMethod呢?编译器说它无法解析符号getMethod。这个问题是,如果目标平台是Windows Phone 8,则.NET 4.5中针对PCL或Windows应用商店的应用程序的反射API已发生一些更改。下面的博客文章提供了一个很好的变化介绍:http://blogs.msdn.com/b/dotnet/archive/2012/08/28/evolving-the-reflection-api.aspx
。值得注意的是:GetMethod和同级不再可用。改为使用DeclaredMethod
属性(可在TypeInfo
实例上找到,您可以使用.GetTypeInfo()
从类型实例中获得该属性)。向下滚动到为新的反射API编写代码–Windows应用商店和可移植类库
,以查找所需信息(但我建议你阅读整篇博文)。同样的问题,当GetMethod与GetMethod不同时,为什么要使用GetMethod?作为旁白,是否有支持反射的计划。在任何时候在PCL中发射?完整准确的答案!!!非常感谢你让我的生活变得更加轻松now@MortenMertner针对.NET 4.5和.NET 4.5的可移植类库已经支持Reflection.EmitWindowsPhone8。