2012-10-10 38 views
32

Tôi đang kết hợp một ứng dụng có giao diện với API Stack và đã theo dõi this tutorial (mặc dù phiên bản API cũ vẫn hoạt động). Vấn đề của tôi là khi sử dụng này trong Windows 8 App Store Tôi contrained bởi Framework .NETCore mà không hỗ trợ phương pháp GetCustomAttributes tìm thấy dưới đây:Phương thức tương đương với `GetCustomAttributes` cho .NETCore (Windows 8 Framework) là gì?

private static IEnumerable<T> ParseJson<T>(string json) where T : class, new() 
    { 
     var type = typeof (T); 
     var attribute = type.GetCustomAttributes(typeof (WrapperObjectAttribute), false).SingleOrDefault() as WrapperObjectAttribute; 
     if (attribute == null) 
     { 
      throw new InvalidOperationException(
       String.Format("{0} type must be decorated with a WrapperObjectAttribute.", type.Name)); 
     } 

     var jobject = JObject.Parse(json); 
     var collection = JsonConvert.DeserializeObject<List<T>>(jobject[attribute.WrapperObject].ToString()); 
     return collection; 
    } 

Câu hỏi của tôi là hai lần. Chính xác những gì GetCustomAttributes làm và có tương đương với phương pháp này trong các ràng buộc của Windows 8 Store App lĩnh vực?

Trả lời

58

Bạn cần sử dụng type.GetTypeInfo(), sau đó có các phương thức GetCustomAttribute khác nhau (thông qua các phương pháp khuyến nông) hoặc có .CustomAttributes cung cấp cho bạn thông tin thô (chứ không phải là Attribute trường hợp).

Ví dụ:

var attribute = type.GetTypeInfo().GetCustomAttribute<WrapperObjectAttribute>(); 
if(attribute == null) 
{ 
    ... 
} 
... 

GetTypeInfo() là nỗi đau của .NETCore cho các tác giả thư viện; p

Nếu .GetTypeInfo() không xuất hiện, sau đó thêm một chỉ thị using System.Reflection;.

+1

Tôi đã dành khoảng hai giờ để tìm cách này. Nên hỏi sớm hơn: P – KronoS

+1

@KronoS heh; Tôi đã có niềm vui của việc chuyển đổi một thư viện hiện có mà sử dụng rộng rãi của sự phản ánh ... tôi và .NETCore bây giờ có kiến ​​thức sâu sắc về nhau, và không phải là một cách tốt. Đây chỉ là đỉnh của tảng băng trôi nếu bạn làm rất nhiều sự phản ánh, p –

+2

Một điều cần thêm vào .NetCore (với xproj), phần mở rộng TypeInfo nằm trong gói "System.Reflection.Extensions": "dotnet5.4": { "phụ thuộc": {"System.Reflection.Extensions": "4.0.1-beta-23516" } } – Spi

0

Thêm gói System.Reflection.TypeExtensions nugget vào dự án của bạn; nó có phần mở rộng GetCustomAttributes.

(đối với VS 2017) một cái gì đó như thế này.

<ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.6'"> 
    <PackageReference Include="System.Reflection.TypeExtensions"> 
     <Version>4.3.0</Version> 
    </PackageReference> 
</ItemGroup> 
Các vấn đề liên quan