我发现这种方法(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;
}
}
答案 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目标也应该有效。