【发布时间】:2017-03-24 07:20:51
【问题描述】:
我需要通过向控件添加 DataSource 来将此处理程序附加到 RadListView 列创建。
public void GenericColumnCreatingHandler<T>(object sender, ListViewColumnCreatingEventArgs e)
{
e.Column.Visible = BaseEntity<int>.MemberVisibility<T>
(e.Column.FieldName, TelerikPropertyVisibilityAttribute.VisibilityTypeEnum.BaseDetails);
e.Column.HeaderText = CaricaTestoLocale(e.Column.HeaderText, "Col_" + e.Column.HeaderText);
e.Column.BestFit();
e.Column.AutoSizeMode = ListViewBestFitColumnMode.AllCells;
}
我的问题是我需要从其他通用方法执行处理程序附加:
private void PopulateRecord(TipoTabellaBase tipo)
{
Type generic = typeof(CommonTableService<>);
Type[] typeArgs = { tipo.Tipo };
var constructed = generic.MakeGenericType(typeArgs);
var instance = Activator.CreateInstance(constructed);
if (instance == null)
return;
MethodInfo getEntities = constructed.GetMethod("GetEntitiesWithNoParameters");
//getEntities = getEntities.MakeGenericMethod(typeArgs);
var result = (IEnumerable<BaseEntity<int>>)getEntities.Invoke(instance, null);
lvRecords.ColumnCreating += base.GenericColumnCreatingHandler<BaseEntity<int>>;
lvRecords.DataSource = result;
BestFit(lvRecords);
generic = null;
typeArgs = null;
constructed = null;
getEntities = null;
instance = null;
}
有问题的行是这一行:
lvRecords.ColumnCreating += base.GenericColumnCreatingHandler<BaseEntity<int>>
因为 BaseEntity 是所有实体的 EF 基类型,但这对于 BaseEntity.MemberVisibility 方法来说还不够;此方法需要知道确切的实体类型才能根据特定的自定义属性设置可见属性(当然还有网格列)。
问题是:我如何在设计时不知道类型的情况下调用 base.GenericColumnCreatingHandler 其中 T 是 TipoTabellaBase tipo.Tipo (type)?
任何帮助将不胜感激! 提前谢谢。
丹尼尔
【问题讨论】:
-
“来自其他泛型方法”-
PopulateRecord不是“泛型方法”(在 C# 意义上)。 -
是的映射器,你是对的。但是,我认为,这还不是真正的问题......
标签: c# generics reflection