Type t = obj.GetType();
t.IsEnum;
t.IsPrimitive;
t.IsGenericType
t.IsPublic;
t.IsNestedPublic
t.BaseType
t.IsValueType
Все перечисленные свойства отсутствуют в UWP. Как проверить эти типы сейчас?
Type t = obj.GetType();
t.IsEnum;
t.IsPrimitive;
t.IsGenericType
t.IsPublic;
t.IsNestedPublic
t.BaseType
t.IsValueType
Все перечисленные свойства отсутствуют в UWP. Как проверить эти типы сейчас?
Приложение С#, которое предназначено для UWP, использует два разных набора типов. Вы уже знаете типы .NET, такие как System.String, но конкретные типы UWP на самом деле являются COM-интерфейсами под капотом. COM - супер-клей interop, основная причина, по которой вы также можете писать приложения UWP в Javascript и С++. И С#, WinRT является неуправляемым api в своем ядре.
Проекция языка для WinRT, встроенная в .NET Framework, делает эту неприятную маленькую деталь невидимой. Некоторые типы WinRT легко идентифицируются, например, в пространстве имен Windows. Некоторые из них могут быть оба, System.String может быть как .NET, так и обернуть WinRT HSTRING..NET Framework автоматически определяет это самостоятельно.
Очень незаметно, но в шпаклере есть трещины. Класс Type является одним из них, трудно отразить для типов COM. Microsoft не смогла скрыть большую разницу между ними и должна была создать класс 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