2015-10-11 4 views
13
Type t = obj.GetType(); 
t.IsEnum; 
t.IsPrimitive; 
t.IsGenericType 
t.IsPublic; 
t.IsNestedPublic 
t.BaseType 
t.IsValueType 

Alle oben genannten Eigenschaften fehlen in UWP. Wie überprüfe ich jetzt diese Typen?Reflexion in universellen Windows-Plattform (UWP) fehlenden Eigenschaften

+1

Verwenden Sie die Klassen und Methoden in der 'Windows.Foundation.Metadata 'Namensraum. Z.B. 'Windows.Foundation.Metadata.ApiInformation.IsMethodPresent'. –

+0

@RaymondChen Danke für den Zeiger, aber wie würde ich nach den obigen Eigenschaften suchen? Die einzigen verfügbaren Methoden sind die Überprüfung von Methode, Ereignis, Eigenschaft und Typ Existenz. – Matt

+0

Wenn Sie einen Typnamen haben, aber Sie nicht wissen, was es ist, können Sie 'ApiInformation.IsEventPresent', dann' ApiInformation.IsMethodPresent', dann 'ApiInformation.IsPropertyPresent' und so weiter aufrufen, bis etwas zurückkommt wahr '. Nicht sicher, wie Sie von C# zu 'IInspectable.GetRuntimeClassName' gelangen. Obwohl Ihr Code im Allgemeinen wissen sollte, was er hat, anstatt zu versuchen, durch Reflexion zu bestimmen. Selbst wenn du darüber nachdenken würdest, was würdest du tun? "Yay, ich weiß, dass das ein Enum ist." Na und? Sie wissen nicht, was die Werte des Enums bedeuten. –

Antwort

28

Eine C# -App, die auf UWP abzielt, verwendet zwei unterschiedliche Arten von Typen. Sie kennen bereits die .NET-Typen wie System.String, aber die UWP-spezifischen Typen sind eigentlich COM-Schnittstellen unter der Haube. COM ist der Super-Leim von Interop, der Hauptgrund, warum Sie UWP-Apps auch in Javascript und C++ schreiben können. Und C#, WinRT ist eine unmanaged API in seinem Kern.

Die Sprachprojektion für WinRT, die in das .NET Framework integriert ist, macht dieses kleine Detail unsichtbar. Einige WinRT-Typen sind leicht zu identifizieren, z. B. alles im Windows-Namespace. Einige können beides sein, ein System.String kann sowohl ein .NET-Typ als auch ein WinRT-HSTRING sein. Das .NET Framework erkennt dies automatisch.

Sehr unsichtbar, aber es gibt einige Risse im Spackle. Die Type-Klasse ist eine davon, Reflection für COM-Typen ist schwierig. Microsoft konnte den großen Unterschied zwischen den beiden nicht verbergen und musste die TypeInfo class erstellen.

Sie finden alle fehlenden Eigenschaften wieder in dieser Klasse. Einige dumme Beispielcode, der es bei der Arbeit in einer UWP App zeigt:

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); 
    } 

Inhalt des VS Ausgabefenster für diesen Code:

False 
False 
False 
True 
False 
System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e 
False 
+0

Danke für die ausführliche Antwort. Das wird mich in die richtige Richtung weisen. – Matt