2012-10-10 27 views
32

Estoy armando una aplicación que interactúa con Stack API y he estado siguiendo this tutorial (aunque la versión anterior de la API todavía funciona). Mi problema es que cuando se utiliza esta dentro del Windows 8 App Store Estoy contrained por el Marco .NETCore que no soporta el método GetCustomAttributes encontrado a continuación:¿Cuál es un método equivalente a `GetCustomAttributes` para .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; 
    } 

Mi pregunta es doble. ¿Qué hace exactamente el GetCustomAttributes y existe un equivalente a este método dentro de las limitaciones del reino de Windows 8 Store App?

Respuesta

58

Es necesario utilizar type.GetTypeInfo(), que a su vez tiene varios métodos GetCustomAttribute (a través de los métodos de extensión), o hay .CustomAttributes que le da la información en bruto (en vez de materializarse Attribute casos).

Por ejemplo:

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

GetTypeInfo() es el dolor de .NETCore para los autores de la biblioteca; p

Si no aparece .GetTypeInfo(), a continuación, añadir una directiva using System.Reflection;.

+1

pasé cerca de dos horas tratando de encontrar esto. Debería haber pedido antes: P – KronoS

+1

@KronoS heh; Tuve el placer de convertir una biblioteca existente que hizo un uso extensivo de la reflexión ... yo y .NETCore ahora estamos íntimamente informados el uno del otro, y no en el buen sentido. Esto es solo la punta del iceberg si reflexiona mucho; p –

+2

Una cosa para agregar en .NetCore (con xproj), las extensiones TypeInfo están en el paquete "System.Reflection.Extensions": "dotnet5.4": { "dependencias": {"System.Reflection.Extensions": "4.0.1-beta-23516" } } – Spi

0

Agregue System.Reflection.TypeExtensions paquete de nugget a su proyecto; tiene la extensión GetCustomAttributes.

(para VS 2017) algo como esto.

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