我尝试使用MetadataType属性类将属性应用于字段。我还没有能够将自定义属性应用于部分类中的字段。我一直关注的一些示例是here和here。
我的最终游戏是尝试标记我需要的课程中的所有字段"使用"做一些工作。
在下面的示例中,我想要字段" 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);
}
}
}
结果是:
重量
但我期待:
名称
重量
答案 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;
}
}