Подтвердить что ты не робот

Отражение в свойствах универсальной оконной платформы (UWP)

Type t = obj.GetType();
t.IsEnum;
t.IsPrimitive;
t.IsGenericType
t.IsPublic;
t.IsNestedPublic
t.BaseType
t.IsValueType

Все перечисленные свойства отсутствуют в UWP. Как проверить эти типы сейчас?

4b9b3361

Ответ 1

Приложение С#, которое предназначено для 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