如何在部分类中访问属性的继承属性?

时间:2015-11-18 14:12:04

标签: c# attributes

我有以下课程:

interface IEntityWithId
{
    int id { get; set; }
}

public class MyEntityMetaData
{
    [Display(Name="Name of my property")]
    public string MyProp { get; set; }
}

public partial class MyEntity : MyEntityMetaData, IEntityWithId
{
}

/* Autogenerated code somewhere else */
public partial class MyEntity
{
    public int Id { get; set; }
    public string MyProp { get; set; }
}

现在我有一个IQueryable<IEntityWithId>,其中的对象实际上是MyEntity类型。

我使用此代码提取显示名称:

private static List<string> GetColumnNames<T>(IQueryable<T> query) where T : class
{
    Type elementType = query.ElementType;
    var defaultColumns = new List<WebGridColumn>();
    var columnNames =
    (
        from
            p in elementType.GetProperties()
        where
           IsBindableType(p.PropertyType) &&
           (p.GetIndexParameters().Length == 0)

        select
        new
        {
            DisplayName = (DisplayNameAttribute)p.GetCustomAttributes(typeof(DisplayNameAttribute), true).FirstOrDefault(),
            Display = (DisplayAttribute)p.GetCustomAttributes(typeof(DisplayAttribute), true).FirstOrDefault(),
            Name = p.Name
        }
    ).Select
    (
        name =>
        name.DisplayName != null ?
        name.DisplayName.DisplayName :
        name.Display != null ?
        name.Display.Name :
        name.Name
    ).ToList();
    return columnNames;
}

但它实际上并不起作用(显示名称为空)。我在方法中获得了正确的类型和属性,但缺少属性。我猜测它与父类的属性和/或我的类属于部分类的事实有关。

我可以做些什么来实际在我的方法中获取这些属性(我无法真正改变我的输入类型)?

编辑:再次遇到问题,我相信这个问题的答案是MVC代码中负责将ViewData.ModelMetadata赋予生命的部分(因为{{1}有正确的那些显示名称,即使它们像在这个问题中那样奇怪地继承了)。这个post让我相信我正在寻找的MVC的这一部分是ViewData.ModelMetadata。其中一天我必须分析代码...

1 个答案:

答案 0 :(得分:0)

自动生成的代码隐藏了MyEntityData.MyProp MyEntity.PropMyEntity.Prop是一个全新的方法,并不会继承MyEntityData.MyProp中可能定义的任何属性。

如果可能,您应该将MyEntityData重构为:

public class MyEntityMetaData
{
    [Display(Name="Name of my property")]
    public virtual string MyProp { get; set; }
}

并使代码生成工具覆盖所述方法:

/* Autogenerated code somewhere else */
public partial class MyEntity
{
    public int Id { get; set; }
    public override string MyProp { get; set; }
}