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

本文关键字:属性 继承 何访问 访问 | 更新日期: 2023-09-27 18:22:20

我有以下类:

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栩栩如生的部分(因为ViewData.ModelMetadata已经更正了这些显示名称,即使它们像这个问题中那样奇怪地继承了)。这篇文章让我相信我正在寻找的MVC的这一部分是ModelMetadataProvider。总有一天我要分析代码。。。

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

自动生成的代码用MyEntity.Prop隐藏MyEntityData.MyPropMyEntity.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; }
}