2012-10-10 18 views
32

Łączę aplikację, która łączy się z Stack API i śledzę numer this tutorial (chociaż stara wersja interfejsu API wciąż działa). Mój problem polega na tym, że podczas korzystania ze sklepu z aplikacjami systemu Windows 8 Ja contrained przez ram .NETCore który nie obsługuje metody GetCustomAttributes znaleźć poniżej:Co to jest odpowiednik metody "GetCustomAttributes" dla .NETCore (Windows 8 Framework)?

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

moje pytanie jest dwojaki. Co dokładnie robi GetCustomAttributes i czy istnieje odpowiednik tej metody w ramach ograniczeń domeny Windows 8 Store App?

Odpowiedz

58

Trzeba użyć type.GetTypeInfo(), który następnie ma różne GetCustomAttribute metodami (poprzez metod rozszerzenie), lub istnieje .CustomAttributes co daje surowy informacji (zamiast zmaterializowanej Attribute instancji).

Na przykład:

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

GetTypeInfo() jest ból .NETCore dla autorów bibliotecznych; p

Jeśli .GetTypeInfo() nie pojawia się, a następnie dodać dyrektywę using System.Reflection;.

+1

Spędziłem około dwóch godzin próbując to znaleźć. Powinien był prosić wcześniej: P – KronoS

+1

@KronoS heh; Miałem przyjemność przekonwertować istniejącą bibliotekę, która szeroko korzystała z refleksji ... ja i .NETCore są teraz doskonale zaznajomieni z każdym innym, a nie w dobry sposób. To jest tylko wierzchołek góry lodowej, jeśli robisz dużo refleksji; p –

+2

Jedna rzecz do dodania na .NetCore (z xproj), rozszerzenia TypeInfo są w pakiecie "System.Reflection.Extensions": "dotnet5.4": { "zależności": {"System.Reflection.Extensions": "4.0.1-beta-23516" } } – Spi

0

Dodaj System.Reflection.TypeExtensions pakiet bryłek do projektu; ma rozszerzenie GetCustomAttributes.

(dla VS 2017) coś w tym stylu.

<ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.6'"> 
    <PackageReference Include="System.Reflection.TypeExtensions"> 
     <Version>4.3.0</Version> 
    </PackageReference> 
</ItemGroup>