Type t = obj.GetType();
t.IsEnum;
t.IsPrimitive;
t.IsGenericType
t.IsPublic;
t.IsNestedPublic
t.BaseType
t.IsValueType
上述所有属性在UWP中都不存在。我现在如何检查这些类型?
针对UWP的c#应用程序使用两组不同的类型。您已经了解了。net类型,比如System。字符串,但是UWP特定的类型实际上是底层的COM接口。COM是互操作的超级粘合剂,这也是为什么你可以用Javascript和c++编写UWP应用程序的基本原因。而c#, WinRT的核心是一个非托管api。
. net框架内建的WinRT的语言投影使得这个讨厌的小细节高度不可见。有些WinRT类型很容易识别,例如Windows命名空间中的任何类型。有些可以两者兼而有之,一个系统。String既可以是。net类型,也可以封装WinRT HSTRING。. net框架会自动计算出这个问题。
非常不可见,但是在抹灰中有一些裂缝。Type类就是其中之一,COM类型的反射是困难的。微软无法隐藏两者之间的巨大差异,因此不得不创建TypeInfo类。
你会在那个类中找到所有丢失的属性。一些愚蠢的示例代码显示了它在UWP应用程序中的工作:
using System.Reflection;
using System.Diagnostics;
...
public App()
{
Microsoft.ApplicationInsights.WindowsAppInitializer.InitializeAsync(
Microsoft.ApplicationInsights.WindowsCollectors.Metadata |
Microsoft.ApplicationInsights.WindowsCollectors.Session);
this.InitializeComponent();
this.Suspending += OnSuspending;
// Reflection code...
var t = typeof(string).GetTypeInfo();
Debug.WriteLine(t.IsEnum);
Debug.WriteLine(t.IsPrimitive);
Debug.WriteLine(t.IsGenericType);
Debug.WriteLine(t.IsPublic);
Debug.WriteLine(t.IsNestedPublic);
Debug.WriteLine(t.BaseType.AssemblyQualifiedName);
Debug.WriteLine(t.IsValueType);
}
VS输出窗口的内容:
False
False
False
True
False
System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
False