Липсват Type.GetMember & MemberInfo.GetCustomAttributes (C# PCL .NET 4.6)

Вероятно съм наистина глупав тук.

Актуализирах едно от моите решения, за да започна да използвам .NET 4.6. Един от моите PCL проекти прави някои размисли върху enum. Актуализирах съвместимостта с 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)


Добре, така че това отне известно време (и забравих, че дори е проблем!!)

Горните коментари обаче ме насочиха в правилната посока, с един голям проблем, че се опитваше да ми даде атрибути на класа (основен enum), а не самите enum елементи. Връзката в коментара по-горе ме отведе до използването на 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