我需要通过向控件添加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(类型),在设计时不知道类型?
任何帮助都将非常感谢! 谢谢你的到来。
丹尼尔
答案 0 :(得分:1)
请注意,此解决方案尚未经过测试。
您必须在运行时实例化base.GenericColumnCreatingHandler<T>
的强类型版本。
从您的代码中,我认为您已经知道如何获取给定方法的MethodInfo
instance。您需要获取MethodInfo
的{{1}}(让我们称之为base.GenericColumnCreatingHandler<T>
)。
然后,您可以使用MakeGenericMethod
:
genericMethodInfo
完成后,您需要调用CreateDelegate
以获取可以分配给MethodInfo typedMethodInfo = genericMethodInfo.MakeGenericMethod(new[] {
typeof(BaseEntity<int>)
});
事件的内容,如here或here所述:
ColumnCreating
编辑:在最后一个代码示例中将lvRecords.ColumnCreating +=
(ListViewColumnCreatingEventHandler)typedMethodInfo.CreateDelegate(
typeof(ListViewColumnCreatingEventHandler), this);
替换为base
。如果特别需要继承方法,则在检索this
时必须注意这一点。