我在同一时间建设桌面,Windows 8商店和Windows Phone新的应用。 所以我创建便携式类库有跨所有平台通用的功能。 我的问题是,当我尝试重用我里面PCL代码,我不能访问内部库的一些方法和属性。 根据MSDN这些方法都支持,但我现在知道我为什么不能访问它们。
var property = memberExpression.Member as PropertyInfo;
if (property == null)
{
}
var getMethod = property.GetGetMethod(true);
if (getMethod.IsStatic)
{}
这里是不能被编译的代码片段。 GetGetMethod和IsStatic是红色里面Visual Studio编辑器。 我不知道这是为什么发生的事情,以及如何访问这些属性。
所以请,如果有任何人曾经做过类似的东西,帮我做这个代码编译。
我们做了一些重构中反射的API .NET的Windows Store应用程序。 请参阅博客文章不断发展的反射API的细节。 除其他事项外,该API的变化陷害我们在未来更好的便携性。 新的API是在Windows应用商店中的应用程序,.NET 4.5和Windows Phone 8出于兼容性可用,旧的API当然是在.NET 4.5和Windows Phone 8仍然可用。
对于便携式类库,如果你只指定了新的反射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)
{}
为了提供有关我的评论使用Type.GetMethod一些信息。
从元数据类型
当评估的元数据返回System.Type
方法和属性,平等的运营商可能会返回不同平台上不同的结果。 在.NET Compact Framework中,对每个连续通话Type.GetMethod
方法返回的新实例System.Reflection.MethodInfo
,所以返回值永远不会结果为相等。 然而,在.NET Framework 4,调用GetMethod
用同样的参数返回一个MethodInfo的相同的实例。 您必须复审并可能修改你的代码,当你用下面的System.Reflection类型的工作: MethodInfo
, FieldInfo
, PropertyInfo
, EventInfo
, MemberInfo
, MethodBase
, ConstructorInfo
和ParameterInfo
。
反思开放式泛型类型
在Windows Phone 7,反射支持封闭泛型类型; 然而,大多数反射操作中不支持开放式泛型类型。 在开放式泛型类型,只有下面的反射操作支持的Windows Phone 7:通过调用检索一个开放的泛型类型或方法GetType
或GetMethods
方法。 通过调用创建从一个开放的泛型类型或方法的泛型类型或方法MakeGenericType
或MakeGenericMethod
方法。 有关开放式泛型类型的所有其他反射操作中, NotSupportedException
异常被抛出。
来源: http://msdn.microsoft.com/en-us/library/gg597392.aspx