Отсутствуют Type.GetMember и MemberInfo.GetCustomAttributes (C# PCL .NET 4.6)

Я, наверное, действительно глупый здесь.

Я обновил одно из своих решений, чтобы начать использовать .NET 4.6. Один из моих проектов PCL размышляет над перечислением. Я обновил совместимость PCL и исправил созданный пустой файл project.json. Однако этот проект PCL больше не строится, поскольку он не распознает ни Type.GetMember(), ни MemberInfo[x].GetCustomAttribute(...).

Код, который я использовал и работал до сегодняшнего дня:

        MemberInfo[] info = e.GetType().GetMember(e.ToString());
        if (info != null && info.Length > 0)
        {
            object[] attributes = info[0].GetCustomAttributes(typeof(Description), false);
            if (attributes != null && attributes.Length > 0)
                return ((Description)attributes[0]).Text;
        }

        return e.ToString();

Проект ссылается только на библиотеку .NET, которая находится по следующему пути:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETPortable\v4.5\Profile\Profile7\

Проект также автоматически поддерживает платформы Xamarin как часть конфигурации PCL.

Любые мысли будут оценены по достоинству.


person David Hamilton    schedule 15.12.2015    source источник
comment
Это профиль 78? См. stackoverflow.com/questions/19741631/   -  person Jason    schedule 15.12.2015
comment
@Jason Это всего лишь профиль 7, но я думаю, что это все равно решит проблему. Нужно провести еще немного тестов, чтобы быть уверенным, но, по крайней мере, сейчас он строится :)   -  person David Hamilton    schedule 15.12.2015


Ответы (1)


ОК, так что это заняло некоторое время (и забыл, что это даже проблема!!)

Однако приведенные выше комментарии указали мне правильное направление, с одной большой проблемой, которая заключалась в том, что он пытался дать мне атрибуты класса (основное перечисление), а не сами элементы перечисления. Ссылка в комментарии выше привела меня к использованию GetTypeInfo в первой строке кода, ее пришлось заменить на GetRuntimeField

Небольшая поправка означала, что я получил что-то вроде следующих строк:

public static string ToDescription(this ArtistConnection e)
{
    var info = e.GetType().GetRuntimeField(e.ToString());
    if (info != null)
    {
        var attributes = info.GetCustomAttributes(typeof(Description), false);
        if (attributes != null)
        {
            foreach (Attribute item in attributes)
            {
                if (item is Description)
                    return (item as Description).Text;
            }
        }
    }

    return e.ToString();
}
person David Hamilton    schedule 21.01.2016
comment
Спасибо за размещение этого Дэвида, действительно помог мне! - person ZeroBased_IX; 03.01.2017