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

Tutte le proprietà sopra indicate sono mancanti in UWP. Come posso verificare questi tipi ora?Riflessione nelle proprietà mancanti della piattaforma Windows universale (UWP)

+1

Utilizzare le classi ei metodi nel 'Windows.Foundation.Metadata 'namespace. Per esempio. 'Windows.Foundation.Metadata.ApiInformation.IsMethodPresent'. –

+0

@RaymondChen Grazie per il puntatore, ma come potrei verificare le proprietà di cui sopra? Gli unici metodi disponibili sono per verificare il metodo, l'evento, la proprietà e il tipo di esistenza. – Matt

+0

Se si ha un nome di tipo ma non si sa di cosa si tratta, suppongo che si possa chiamare 'ApiInformation.IsEventPresent', quindi' ApiInformation.IsMethodPresent', quindi 'ApiInformation.IsPropertyPresent', e così via, finché qualcosa non ritorna' true'. Non sei sicuro di come sia "IInspectable.GetRuntimeClassName" da C#. Sebbene in generale, il codice dovrebbe sapere cosa ha, piuttosto che cercare di determinare tramite riflessione. Anche se avessi una riflessione, cosa faresti? "Sì, lo so che questo è un enum." E allora? Non sai cosa significano i valori dell'enum. –

risposta

28

Un'app C# che si rivolge a UWP utilizza due tipi distinti di tipi. Conosci già i tipi .NET, come System.String, ma i tipi specifici UWP sono in realtà interfacce COM sotto il cofano. COM è il super-colla di interoperabilità, il motivo fondamentale per cui puoi anche scrivere app UWP in Javascript e C++. E C#, WinRT è un'api non gestita nel suo nucleo.

La proiezione di lingua per WinRT integrato in .NET Framework rende questo piccolo e brutto dettaglio altamente invisibile. Alcuni tipi di WinRT sono facili da identificare, ad esempio nello spazio dei nomi di Windows. Alcuni possono essere entrambi, un System.String può essere sia un tipo .NET sia un wrap WINTRT HSTRING. .NET Framework lo rileva automaticamente da solo.

Molto invisibile, ma ci sono alcune crepe nello spackle. La classe Type è una di queste, Reflection per i tipi COM è difficile. Microsoft non ha potuto nascondere la grande differenza tra i due e ha dovuto creare il TypeInfo class.

Troverai tutte le proprietà mancanti in quella classe. Alcuni codice di esempio sciocco che mostra al lavoro in un'applicazione 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); 
    } 

contenuto della finestra di uscita VS per questo codice:

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

Grazie per la risposta dettagliata. Questo mi indicherà nella giusta direzione. – Matt