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
fonte
2015-10-11 21:42:03
Utilizzare le classi ei metodi nel 'Windows.Foundation.Metadata 'namespace. Per esempio. 'Windows.Foundation.Metadata.ApiInformation.IsMethodPresent'. –
@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
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. –