C#自定义属性未应用

时间:2017-11-22 00:51:56

标签: c# custom-attributes metadatatype

我尝试使用MetadataType属性类将属性应用于字段。我还没有能够将自定义属性应用于部分类中的字段。我一直关注的一些示例是herehere

我的最终游戏是尝试标记我需要的课程中的所有字段"使用"做一些工作。

在下面的示例中,我想要字段" Name"应用FooAttribute。在现实生活中,我处理生成的代码......

在我非常做的例子中,我有一个部分类 - Cow,它是生成的代码;

namespace Models
{
    public partial class Cow
    {
        public string Name;
        public string Colour;
    }
}

我需要Name字段才能使用我的FooAttribute,所以我已经完成了这个;

using System;
using System.ComponentModel.DataAnnotations;

namespace Models
{
    public class FooAttribute : Attribute { }

    public class CowMetaData
    {
        [Foo]
        public string Name;
    }

    [MetadataType(typeof(CowMetaData))]
    public partial class Cow
    {
        [Foo]
        public int Weight;

        public string NoAttributeHere;
    }

}

这对于应用了FooAttribute的Weight字段非常有用 - 但我希望这是因为它在部分类中。 “名称”字段不会从元数据中获取属性,这正是我真正需要的。

我错过了什么,或者我错了什么?

更新:这是我使用FooAttribute搜索字段的方式;

public static void ShowAllFieldsWithFooAttribute(Cow cow)
{
    var myFields = cow.GetType().GetFields().ToList();
    foreach (var f in myFields)
    {
        if (Attribute.IsDefined(f, typeof(FooAttribute)))
        {
            Console.WriteLine("{0}", f.Name);
        }
    }
}

结果是:
重量

但我期待:
名称
重量

1 个答案:

答案 0 :(得分:0)

属性是元数据的一部分,它们不会影响编译结果。将MetadataType属性设置为类不会将所有元数据传播到类的属性/字段。因此,您必须阅读代码中的MetadataType属性,并使用MetadataType属性中定义的类型的元数据而不是初始类(或者在您的情况下一起使用)

检查样本:

    var fooFields = new Dictionary<FieldInfo, FooAttribute>();

    var cowType = typeof (Cow);
    var metadataType = cowType.GetCustomAttribute<MetadataTypeAttribute>();
    var metaFields = metadataType?.MetadataClassType.GetFields() ?? new FieldInfo[0];

    foreach (var fieldInfo in cowType.GetFields())
    {
        var metaField = metaFields.FirstOrDefault(f => f.Name == fieldInfo.Name);
        var foo = metaField?.GetCustomAttribute<FooAttribute>() 
                           ?? fieldInfo.GetCustomAttribute<FooAttribute>();
        if (foo != null)
        {
            fooFields[fieldInfo] = foo;
        }
    }