我有以下课程:
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
。其中一天我必须分析代码...
答案 0 :(得分:0)
自动生成的代码隐藏了MyEntityData.MyProp
MyEntity.Prop
。 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; }
}