【发布时间】:2015-02-04 16:16:57
【问题描述】:
我想指定一个可以接受方法的参数,而不必指定通用参数来生成给定方法的 MethodInfo。
例如,我想写这样的代码:
interface IService
{
object AMethod(int p1, int p2);
}
IThingy<IService>() thingy;
thingy.Add(svc => svc.AMethod);
我能产生的最接近的选项是:
interface IThingy<TService>
{
void Add1<T0, T1, TResult>(Expression<Func<TService, Func<T0, T1, TResult>>> expression);
void Add2(Expression<Func<TService, Func<int, int, object>>> expression);
void Add3(Expression<Action<TService>> expression);
}
thingy.Add1<int, int, object>(svc => svc.AMethod);
thingy.Add2(svc => svc.AMethod);
thingy.Add3(svc => svc.AMethod(0, 0));
Add1 意味着许多 Func 重载,我可以接受,但如果不指定泛型参数就无法调用。
Add2 不需要通用参数,但意味着每个参数签名都有一个特定的重载。
Add3 需要调用方法,包括假参数。
仅供参考,我将处理表达式以获取给定方法的 MethodInfo,如下所示:
MemberInfo GetMemberFromExpression<T>(Expression<ActionT>> expression)
{
return ((MethodCallExpression)expression.Body).Method
}
GetMemberFromExpression(svc => svc.AMethod(0, 0));
【问题讨论】:
-
如果你想要的只是
MethodInfo,为什么不能直接处理类型参数T?为什么是这种表达方式? -
处理类型参数会给我类型,但我想要方法。
-
在您的示例中,所涉及的类型只有一种方法。因此,给定类型,该方法很容易识别。如果您的类型有不止一种方法,那么坦率地说,这只是使这个问题易于理解的众多缺失细节中的一种。似乎这就是通常被描述为"XY Problem" 的内容。 IE。你有一些其他的目标正在努力实现,而不是问如何实现那个目标,你问的是如何做一些你认为是实现该目标的正确方法的具体事情。跨度>
标签: c# linq-expressions