如何访问分部类中属性的继承属性
本文关键字:属性 继承 何访问 访问 | 更新日期: 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.MyProp
。MyEntity.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; }
}