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

Tất cả các thuộc tính trên đều bị thiếu trong UWP. Làm cách nào để kiểm tra các loại này ngay bây giờ?Phản ánh trong nền tảng cửa sổ phổ quát (UWP) thiếu thuộc tính

+1

Sử dụng các lớp học và phương pháp trong 'Windows.Foundation.Metadata 'namespace. Ví dụ. 'Windows.Foundation.Metadata.ApiInformation.IsMethodPresent'. –

+0

@RaymondChen Cảm ơn con trỏ, nhưng làm cách nào để kiểm tra các thuộc tính trên? Các phương thức duy nhất có sẵn là để kiểm tra phương thức, sự kiện, thuộc tính và kiểu tồn tại. – Matt

+0

Nếu bạn có một tên loại nhưng bạn không biết nó là gì, tôi đoán bạn có thể gọi 'ApiInformation.IsEventPresent', sau đó là' ApiInformation.IsMethodPresent', sau đó 'ApiInformation.IsPropertyPresent', và cứ thế, cho đến khi một cái gì đó trả về ' đúng'. Không chắc chắn cách bạn truy cập 'IInspectable.GetRuntimeClassName' từ C#. Mặc dù nói chung, mã của bạn nên biết những gì nó có, thay vì cố gắng để xác định thông qua sự phản ánh. Ngay cả khi bạn đã phản ánh, bạn sẽ làm gì? "Yay, tôi biết rằng đây là một enum." Vậy cái gì? Bạn không biết giá trị của enum có nghĩa là gì. –

Trả lời

28

Ứng dụng C# nhắm mục tiêu UWP sử dụng hai nhóm loại riêng biệt. Bạn đã biết các kiểu .NET, giống như System.String, nhưng các kiểu UWP cụ thể thực sự là các giao diện COM dưới mui xe. COM là siêu keo của interop, lý do cơ bản tại sao bạn cũng có thể viết các ứng dụng UWP trong Javascript và C++. Và C#, WinRT là một api không được quản lý ở cốt lõi của nó.

Trình chiếu ngôn ngữ cho WinRT được tích hợp vào .NET Framework làm cho chi tiết nhỏ khó hiểu đó vô hình cao. Một số kiểu WinRT rất dễ nhận biết, ví dụ như bất cứ thứ gì trong không gian tên Windows. Một số có thể là cả hai, một System.String có thể là cả một loại .NET và bọc một WinRT HSTRING. .NET Framework tự động tính toán điều này.

Rất vô hình, nhưng có một số vết nứt trong vòng tròn. Lớp Type là một trong số chúng, Reflection cho loại COM là khó khăn. Microsoft không thể che giấu sự khác biệt lớn giữa hai và đã phải tạo ra TypeInfo class.

Bạn sẽ tìm thấy tất cả các thuộc tính bị thiếu trong lớp đó. Một số mẫu mã ngớ ngẩn cho thấy nó tại nơi làm việc trong một ứng dụng 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); 
    } 

Nội dung của cửa sổ Output VS cho mã này:

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

Cảm ơn bạn đã phản hồi chi tiết. Điều này sẽ chỉ cho tôi đi đúng hướng. – Matt

Các vấn đề liên quan