【发布时间】:2011-11-08 00:17:10
【问题描述】:
是否可以在不提供参数和/或括号的情况下将方法的强类型名称作为 lambda 表达式传递?
例如,如果我有以下方法:
public class CalleeClass
{
public void MethodA(obj param1, obj param2)
{
...
}
}
我想通过以下方式在别处调用此方法:
return new MyClass<CalleeClass>(c => c.MethodA); //Note: no ()'s or arguments
MyClass 将负责使用方法名称作为目标的 MVC 路由。这里的目标是我们希望能够通过控制器方法使用强类型视图,并且我不想提供不被使用的“哑”参数。
目前,我正在使用类似于以下的代码来使用方法名称,但这种风格仍然需要传入假参数和/或括号。
public void MyClass<T>(Expression<Action<T>> action)
{
var methodName = (action.Body as MethodCallExpression).Method.Name;
}
编辑:很抱歉造成混淆,但我最初试图通过仅包含我认为您需要的内容来简化问题,并在这样做时遗漏了一些关键信息。这里的最终目标是让 MyClass 接收到泛型类型 + lambda 表达式,并且 lambda 表达式可以传入强类型方法名,而无需实例化对象。 -MB
【问题讨论】:
-
可以不设置可选参数吗?另外: MethodCallExpression 除非我很确定它有括号,否则它不会起作用。
-
参数不傻;它们被编译器使用...
-
没有冒犯参数,但我们只需要路由的方法名称,给人的印象是我们正在实例化一个对象似乎很奇怪。我不相信这是可能的,这就是我来这里的原因。 :)
-
为什么不使用 MethodInfo?类似于: var method = typeof(AClass).GetMethods().Where((m) => m.Name.Equals(@"MethodA")).FirstOrDefault();然后在MyClass中使用method作为你需要的参数。
标签: c# linq asp.net-mvc-3 delegates