如何获取元数据自定义属性?

Dav*_*vid 5 c# reflection data-annotations

我有一个类在类级别定义数据注释.元数据类具有与之关联的自定义属性,以及通常的DisplayName,DisplayFormat等.

public class BaseMetaData
{
    [DisplayName("Id")]
    public object Id { get; set; }

    [DisplayName("Selected")]
    [ExportItem(Exclude = true)]
    public object Selected { get; set; }
}

[MetadataType(typeof(BaseMetaData))]
public class BaseViewModel
{
    public int Id { get; set; }
    public bool Selected { get; set; }
Run Code Online (Sandbox Code Playgroud)

给定类型T,如何从元数据类中检索自定义属性?下面的尝试不起作用,因为元数据属性来自BaseViewModel而不是BaseMetaData类.

需要一般工作,即不能做typeof(BaseMetaData).GetProperty(e.PropertyName).想知道是否有从类中获取MetadataType的方法,那么它将使其成为可能.

var type = typeof (T);
var metaData = ModelMetadataProviders.Current.GetMetadataForType(null, type);

var propertMetaData = metaData.Properties
    .Where(e =>
    {
        var attribute = type.GetProperty(e.PropertyName)
            .GetCustomAttributes(typeof(ExportItemAttribute), false)
            .FirstOrDefault() as ExportItemAttribute;
        return attribute == null || !attribute.Exclude;
    })
    .ToList();
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 16

通过使用MetadataTypeAttribute类型获取自定义属性找到解决方案.

var type = typeof (T);
var metadataType = type.GetCustomAttributes(typeof(MetadataTypeAttribute), true)
    .OfType<MetadataTypeAttribute>().FirstOrDefault();
var metaData = (metadataType != null)
    ? ModelMetadataProviders.Current.GetMetadataForType(null, metadataType.MetadataClassType)
    : ModelMetadataProviders.Current.GetMetadataForType(null, type);

var propertMetaData = metaData.Properties
    .Where(e =>
    {
        var attribute = metaData.ModelType.GetProperty(e.PropertyName)
            .GetCustomAttributes(typeof(ExportItemAttribute), false)
            .FirstOrDefault() as ExportItemAttribute;
        return attribute == null || !attribute.Exclude;
    })
    .ToList();
Run Code Online (Sandbox Code Playgroud)