偶尔我会遇到需要在不知道其类型的情况下执行泛型方法的问题。
我知道每次使用反射我都可以这样做,但是我正在尝试编写辅助方法:
public static object InvokeGeneric<T>(this T @this,
Expression<Func<T, object>> method,
Type genericType,
params object[] arguments)
{
// I think I know what to do here
// look at the expression tree, grab
// the method info, do the
// reflection in here, etc.
return null;
}
所以我可以这样做:
this._myService.InvokeGeneric(
e => e.MyGenericMethod, // interface IMyService { void MyGenericMethod<T>(T t); }
typeof(MyGenericType),
myArg);
但是我收到此错误:无法转换方法组&#39; XXX&#39;到非委托类型&#39;对象&#39;。
如果不更改我的调用语法,如何更改我的帮助方法的方法签名以执行我想要的操作?
编辑:
我明白了:
this._myService.InvokeGeneric<IMyService, object, MyArgType>(e => e.MyGenericMethod, typeof(MyGenericType), myArg);
缺点(除了额外输入外)是您需要为您希望支持的Func<>
和Action<>
的每个通用变体重载。
public static object InvokeGeneric<T, T1>(this object @this, Expression<Func<T, Action<T1>>> method, Type genericType, params object[] arguments)
{ }
public static object InvokeGeneric<T, T1, T2>(this object @this, Expression<Func<T, Action<T1, T2>>> method, Type genericType, params object[] arguments)
{ }
等。我将使用该解决方案,但如果有人遇到符合简短语法的内容,请告诉我,我会接受它。阅读一些关于方法组的知识让我意识到我的语法是模棱两可的,如果有重载的话,这意味着像这样的强类型可能更好。无论如何。