gpt4 book ai didi

c# - 附加未知类型的通用方法事件处理程序

转载 作者:太空宇宙 更新时间:2023-11-03 12:37:05 25 4
gpt4 key购买 nike

我需要通过向控件添加数据源,将此处理程序附加到 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)?

任何帮助将不胜感激!提前致谢。

丹尼尔

最佳答案

请注意,此解决方案未经测试。

您必须实例化 base.GenericColumnCreatingHandler<T> 的强类型版本在运行时。

根据您的代码,我认为您已经知道如何获得 MethodInfo instance对于给定的方法。您将需要获得 MethodInfo对于 base.GenericColumnCreatingHandler<T> (我们称之为 genericMethodInfo )。

然后,您可以使用 MakeGenericMethod 创建该方法的强类型版本:

MethodInfo typedMethodInfo = genericMethodInfo.MakeGenericMethod(new[] {
typeof(BaseEntity<int>)
});

完成后,您需要调用 CreateDelegate 获得可以分配给 ColumnCreating 的东西事件,如所述herehere :

lvRecords.ColumnCreating +=
(ListViewColumnCreatingEventHandler)typedMethodInfo.CreateDelegate(
typeof(ListViewColumnCreatingEventHandler), this);

编辑:已替换 basethis在最后一个代码示例中。如果特别需要继承方法,则在检索 genericMethodInfo 时必须注意这一点。 .

关于c# - 附加未知类型的通用方法事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40524636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com