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

上記のプロパティはすべてUWPにはありません。これらのタイプは現在どのようにチェックするのですか?ユニバーサル・ウィンドウ・プラットフォーム(UWP)不足プロパティのリフレクション

+1

'Windows.Foundation.Metadataのクラスとメソッドを使用します'名前空間。例えば。 Windows.Foundation.Metadata.ApiInformation.IsMethodPresent'。 –

+0

@RaymondChenポインタのおかげで、上記のプロパティを確認する方法は?使用可能なメソッドは、メソッド、イベント、プロパティ、および型の存在をチェックするためだけです。 – Matt

+0

タイプ名は分かっていますが、それが何であるかわからない場合は、 'ApiInformation.IsEventPresent'、次に' ApiInformation.IsMethodPresent'、 'ApiInformation.IsPropertyPresent'などを呼び出すことができます。何かが'本当です。 C#から 'IInspectable.GetRuntimeClassName'にどうやって行くのか不明です。一般的に、コードはリフレクションを介して判断しようとするのではなく、そのコードが持つものを知る必要があります。あなたが反射を持っていても、あなたは何をしますか? 「これは列挙型だとわかっています。」だから何?列挙型の値がどういう意味か分かりません。 –

答えて

28

UWPをターゲットとするC#アプリは、2つの異なるセットのタイプを使用します。あなたはSystem.Stringのような.NETの型をすでに知っていますが、UWP固有の型は実際にはフードの下のCOMインタフェースです。 COMはinteropのスーパーグルーです.JavaScriptやC++でUWPアプリケーションを書くことができる基本的な理由です。そして、C#、WinRTはその中心にある管理されていないAPIです。

.NET Frameworkに組み込まれたWinRT用言語投影は、その厄介な小さな詳細を非常に目立たなくします。いくつかのWinRTタイプは、Windowsネームスペースなど、何かを識別するのが簡単です。いくつかはどちらでもかまいませんが、System.Stringは.NETタイプとWinRT HSTRINGの両方をラップすることができます。 .NET Frameworkは、それを自動的に把握します。

非常に目に見えませんが、スパークルにはいくつかの亀裂があります。 Typeクラスはその1つですが、Reflection for COMタイプは難しいです。 Microsoftは両者の大きな違いを隠すことができず、TypeInfo classを作成しなければならなかった。

不足しているプロパティがすべてそのクラスに戻ってきます。 UWPアプリでの仕事でそれを示していくつかの愚かなサンプルコード:このコードのVSの出力ウィンドウの

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

コンテンツ:

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

詳細な応答をありがとう。これは私を正しい方向に向けるでしょう。 – Matt

関連する問題