使用强类型方法作为参数而不指定参数

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

Oli*_*bes 2

您实际上可以传递不带参数的方法:

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)

分析表达式有点复杂,但是我测试过,可以用。