使用unknow类型附加Generic方法事件处理程序

时间:2016-11-10 09:58:49

标签: c# generics reflection

我需要通过向控件添加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(类型),在设计时不知道类型?

任何帮助都将非常感谢! 谢谢你的到来。

丹尼尔

1 个答案:

答案 0 :(得分:1)

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

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

从您的代码中,我认为您已经知道如何获取给定方法的MethodInfo instance。您需要获取MethodInfo的{​​{1}}(让我们称之为base.GenericColumnCreatingHandler<T>)。

然后,您可以使用MakeGenericMethod

创建该方法的强类型版本
genericMethodInfo

完成后,您需要调用CreateDelegate以获取可以分配给MethodInfo typedMethodInfo = genericMethodInfo.MakeGenericMethod(new[] { typeof(BaseEntity<int>) }); 事件的内容,如herehere所述:

ColumnCreating

编辑:在最后一个代码示例中将lvRecords.ColumnCreating += (ListViewColumnCreatingEventHandler)typedMethodInfo.CreateDelegate( typeof(ListViewColumnCreatingEventHandler), this); 替换为base。如果特别需要继承方法,则在检索this时必须注意这一点。