如何将方法组强制转换为对象? “无法将方法组'XXX'转换为非委托类型'对象'。”

时间:2014-07-22 23:32:34

标签: c#

偶尔我会遇到需要在不知道其类型的情况下执行泛型方法的问题。

我知道每次使用反射我都可以这样做,但是我正在尝试编写辅助方法:

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)
{ }

等。我将使用该解决方案,但如果有人遇到符合简短语法的内容,请告诉我,我会接受它。阅读一些关于方法组的知识让我意识到我的语法是模棱两可的,如果有重载的话,这意味着像这样的强类型可能更好。无论如何。

0 个答案:

没有答案