使用反射将委托转换为通用

时间:2014-10-23 15:11:22

标签: c# generics reflection parameters delegates

我使用反射来调用泛型方法:

public DataTable GetEntityData<T>(string EntitiesType, string Query, int Page, List<string> Columns, string OrderByClause, object[] QueryArgs)
{
    using (var model = new MK3Entities())
    {
        Type ET = GetEntitiesType(EntitiesType);

        MethodInfo method = typeof(MK3Entities).GetMethod("GetEntityData");
        MethodInfo generic = method.MakeGenericMethod(ET);

        var obj = (generic.Invoke(model, new object[] { Query, NUMBEROFWIDGETRESULTS, Page, Columns, OrderByClause, QueryArgs }) as DataTable);

        return obj;
    }
}

我通过反射调用的方法接受一个执行后处理的泛型委托。

GetEntityData(reflection invoked)函数将委托作为参数方法存根和委托声明:

public delegate IEnumerable<T> PostProcessing<T>(IEnumerable<T> Source) where T : class;

public DataTable GetEntityData<D>(string Query, int NumbOfResults, int Skip, List<string> Columns, string OrderByClause, object[] QueryArgs, PostProcessing<D> PostDelegate)
       where D : class
{
}

在创建泛型方法的第一个GetEntityData<T>内部,我还需要创建一个泛型方法作为委托,作为传递变量ET作为类型的参数传入。

有谁知道我该怎么做?

1 个答案:

答案 0 :(得分:0)

我通过将Generic传递给虽然反射来修复此问题。原始GetEntityData现在接受一个名为FormatInfo的methodinfo作为参数,然后将泛型绑定到它们的输入类型ET

Type DelegateParam = typeof(MK3Entities.PostProcessing<>).MakeGenericType(ET);

MethodInfo GenericParam = FormatInfo.MakeGenericMethod(ET);
var Formatter = Delegate.CreateDelegate(DelegateParam, GenericParam);

var obj = (generic.Invoke(model, new object[] { Query, NUMBEROFWIDGETRESULTS, Page, Columns,     OrderByClause, QueryArgs, Formatter }) as DataTable);