Подтвердить что ты не робот

Что такое эквивалентный метод для `GetCustomAttributes` для .NETCore(Windows 8 Framework)?

Я собираю приложение, которое взаимодействует со Stack API и отслеживает этот учебник (хотя старая версия API все еще работает). Моя проблема заключается в том, что при использовании этого в приложении для хранилища Windows 8 меня не устраивает .NETCore Framework, которая не поддерживает метод GetCustomAttributes, найденный ниже:

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

Мой вопрос в два раза. Что именно делает GetCustomAttributes и есть ли эквивалент этого метода в пределах ограничений в области приложений Windows 8 Store?

4b9b3361

Ответ 1

Вам нужно использовать type.GetTypeInfo(), который затем имеет различные методы GetCustomAttribute (через методы расширения), или есть .CustomAttributes, который дает вам необработанную информацию (а не материализованные экземпляры Attribute).

Например:

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

GetTypeInfo() является болью .NETCore для авторов библиотеки; p

Если .GetTypeInfo() не появляется, добавьте директиву using System.Reflection;.

Ответ 2

Добавьте в свой проект самодельный пакет System.Reflection.TypeExtensions; он имеет расширение GetCustomAttributes.

(для VS 2017) что-то вроде этого.

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