如何从元数据类中获取具有属性集的类的属性值
本文关键字:属性 获取 元数据 | 更新日期: 2023-09-27 18:28:31
我遇到了这个问题,在SO上找不到任何通用的解决方案,所以我把它发布在这里。
如何从元数据类中获取具有属性集的类的属性值
我有一个自定义属性,我想用它来表示我感兴趣的属性。但是,该属性必须通过元数据类应用,因为我使用的是实体框架类。
我想获得由设置了属性的元数据指定的类型值,但这段代码找不到由元数据定义的属性。
public class PropertyAttribute : Attribute { }
[MetadataType(typeof(CarMetaData))]
public class Car
{
[Property]
public int FieldA { get; set; }
public int MetaFieldA { get; set; }
internal sealed class CarMetaData
{
[Property]
public int MetaFieldA { get; set; }
}
}
var car = new Car() { FieldA = 1234, MetaFieldA = 4321 };
var source = car;
var sourceType = source.GetType();
var props = sourceType.GetProperties().Where(p => Attribute.IsDefined(p, typeof(PropertyAttribute)));
foreach (PropertyInfo prop in props)
{
var sourceProp = sourceType.GetProperty(prop.Name);
var val = sourceProp.GetValue(source, null);
//do something with val
}
这可以通过查找元数据类类型,并查找定义了属性的类型的属性来完成。
var metaAttr = (MetadataTypeAttribute)sourceType.GetCustomAttribute(typeof(MetadataTypeAttribute), true);
var metaClassType = metaAttr.MetadataClassType;
var props = metaClassType.GetProperties().Where(p => Attribute.IsDefined(p, typeof(PropertyAttribute)));
foreach (PropertyInfo prop in props)
{
var sourceProp = sourceType.GetProperty(prop.Name);
var val = sourceProp.GetValue(source, null);
//do something with val
}