如何从具有元数据类设置的属性的类中获取属性的值?

时间:2014-10-29 22:41:22

标签: c# entity-framework

我遇到了这个问题,在SO上找不到任何一般解决方案,所以我在这里发帖。

如何从具有元数据类设置属性的类中获取属性的值?

我有一个自定义属性,我想用它来表示我感兴趣的属性。但是,该属性必须通过元数据类应用,因为我正在使用带有Entity Framework的类。

我想获取由具有我的属性集的元数据指定的类型的值,但此代码未找到元数据定义的属性。

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
}

1 个答案:

答案 0 :(得分:0)

这可以通过查找元数据类类型,并找到已定义属性的 类型的属性来完成。

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
}