Mat*_*man 5 c# linq delegates asp.net-mvc-3
是否可以将方法的强类型名称作为lambda表达式传递而不提供参数和/或括号?
例如,如果我有以下方法:
public class CalleeClass
{
public void MethodA(obj param1, obj param2)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
我想通过以下方式将此方法称为:
return new MyClass<CalleeClass>(c => c.MethodA); //Note: no ()'s or arguments
Run Code Online (Sandbox Code Playgroud)
其中MyClass负责使用方法名称作为目标的MVC路由.这里的目标是我们希望能够通过控制器方法使用强类型视图,并且我不希望提供不使用的"哑"参数.
目前,我使用类似于以下的代码来使用方法名称,但这种样式仍然需要传递假参数和/或括号.
public void MyClass<T>(Expression<Action<T>> action)
{
var methodName = (action.Body as MethodCallExpression).Method.Name;
}
Run Code Online (Sandbox Code Playgroud)
编辑:很抱歉混淆,但我最初试图通过仅包括我认为你需要的东西来简化问题,并且这样做会遗漏一些关键信息.这里的最终目标是让MyClass接收泛型类型+ lambda表达式,并且lambda表达式可以传入强类型方法名称而不实例化对象.-MB
您实际上可以传递不带参数的方法:
class PassActionTest
{
public void Test( )
{
var c = new C();
var myClass = new MyClass(c.MethodA);
}
}
class MyClass
{
public MyClass(Action<object,object> action)
{
string methodName = action.Method.Name;
}
}
class C
{
public void MethodA(object param1, object param2)
{
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:根据马特贝克曼的编辑,包含 MethodA 的类不应被实例化。我的新解决方案是:
class PassActionTest
{
public void Test()
{
var myClass = new MyClass(c => c.MethodA);
}
}
class MyClass
{
public MyClass(Expression<Func<C, Action<object, object>>> expr)
{
UnaryExpression unaryExpr = (UnaryExpression)expr.Body;
MethodCallExpression methodCallExpr = (MethodCallExpression)unaryExpr.Operand;
ConstantExpression constantExpr = (ConstantExpression)methodCallExpr.Arguments[2];
MethodInfo methodInfo = (MethodInfo)constantExpr.Value;
string methodName = methodInfo.Name;
}
}
class C
{
public void MethodA(object param1, object param2)
{
}
}
Run Code Online (Sandbox Code Playgroud)
分析表达式有点复杂,但是我测试过,可以用。
| 归档时间: |
|
| 查看次数: |
2517 次 |
| 最近记录: |