为什么我在VisualStudio for Mac C#上找不到IsAssignableFrom? (Xamarin)

时间:2017-09-22 23:20:11

标签: c# xamarin

我发现这种方法(Type.IsAssignableFrom)会非常方便,但VS(对于Mac,Xamarin Forms项目)将其标记为缺少方法。 (我得到了红色的squigly)对于与Xamarin一起工作的.Net版本是否已弃用或丢失?

这是我从msdn获得的代码:

public class Example
{

public static void Main() {
  Type t = typeof(IEnumerable);
  Type c = typeof(Array);

  IEnumerable instanceOfT;
  int[] instanceOfC = { 1, 2, 3, 4 };
  if (t.IsAssignableFrom(c))
     instanceOfT = instanceOfC;
  }
}

1 个答案:

答案 0 :(得分:2)

由于Xamarin.Forms项目是具有多个目标框架的Portable Class Library,因此您只能使用所有目标中存在的内容。

MSDN article可能会提供更多信息:

  

随着.NET Native的出现,我们拥有了一项允许我们使用的技术   将您的应用程序与框架和第三方静态链接   依赖。为了使链接可行,重要的是它可以   确定您未使用的框架部分。其他   这些技术,比如C ++,这有点简单   系统没有反射等动力。当然,.NET   Native仍支持反射,但我们想制作平台   更多的付费游戏友好,这意味着你不需要付钱   您不使用的功能。反射尤其如此,   因为它对运行时和运行时强加了很大的限制   编译器可以基于静态信息做。

     

理想情况下,反射应该是.NET Core中的可选组件   您可能决定不在您的应用程序中使用。该   棘手的部分是System.Object依赖于反射通过   Object.GetType()。为了打破这种依赖,我们决定了这一点   System.Type不再代表完整的反射类型   信息,但只有类型名称。这意味着System.Type中   .NET Core不再包含GetMembers()等API,但仍在继续   公开名称等API。

     

为了获取您必须访问的其他类型信息   调用一个名为GetTypeInfo()的扩展方法   的System.Reflection。它返回类型为Type的新类型TypeInfo   曾经是。

所以你应该这样做:

if (t.GetTypeInfo().IsAssignableFrom(c.GetTypeInfo()))

从项目中删除.NET Core目标也应该有效。