Type.GetMember&缺少MemberInfo.GetCustomAttributes(C#PCL .NET 4.6)

时间:2015-12-15 15:04:32

标签: .net xamarin portable-class-library

我在这里可能真的很蠢。

我已经更新了我的解决方案以开始使用.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配置的一部分。

任何想法都会受到高度赞赏。

1 个答案:

答案 0 :(得分:5)

好的,所以这需要一段时间(忘记它甚至是一个问题!!)

然而,上面的评论指出了我正确的方向,有一个大问题是它试图给我属性类(主枚举)而不是枚举元素本身。上面评论中的链接让我在第一行代码中使用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();
}