我使用反射来调用泛型方法:
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作为类型的参数传入。
有谁知道我该怎么做?
答案 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);