我正在编写一个动态模型绑定器,它将函数绑定到api调用。
这是我的测试控制器,有2个功能。它们具有不同参数类型的不同功能。
public class MyTestController : System.Web.Mvc.Controller {
public ActionResult MyFunction() {
// Do awesome stuff
return result;
}
public ActionResult MyOtherFunction(int i) {
// Do other awesome stuff
return result;
}
}
使用此模型绑定器,我希望能够选择特定功能并创建我的api呼叫名称。
public static class ModelBinder {
public static string GetApiCall<T>( Expression<Func<T, Func<ActionResult>>> expression ) {
var unaryExpression = (UnaryExpression)expression.Body;
var methodCallExpression = (MethodCallExpression)unaryExpression.Operand;
var methodInfoExpression = (ConstantExpression)methodCallExpression.Arguments.Last();
var methodInfo = (MemberInfo)methodInfoExpression.Value;
var controllerName = typeof( T ).Name.Replace( "Controller", "" );
var methodName = methodInfo.Name;
var myApiCallName = string.Format( "{0}_{1}", controllerName, methodName ).ToLower();
return myApiCallName;
}
}
使用ModelBinder可以在没有参数的情况下使用控制器类中的函数。但不是参数化函数。
var apiCallName1 = ModelBinder.GetApiCall<MyTestController>( x => x.MyFunction );
var apiCallName2 = ModelBinder.GetApiCall<MyTestController>( x => x.MyOtherFunction ); // Compiler Says no!
由于函数定义不匹配,无法编译。在这种情况下,我需要定义另一个 GetApiCall 方法,其他参数类型为 Expression&gt;&gt; 。
所以这是实际问题:
C#中是否有任何类型接受所有类型的委托类型,但它绑定到特定的返回类型?所以只有返回ActionResult类型结果的函数。
public static string GetApiCall<T>( Expression<Func<T, MagicDelegateTypeThatTakesAllFunctionsWithAllParameterTypes>> expression ) {
// do awesome stuff
}
修改
感谢@LeBaptiste Link。可以使用委托数据类型调用函数。
public static string GetApiCall<T>( Expression<Func<T, Delegate>> expression ) {
// do awesome stuff
}
// Calling the method
ModelBinder.GetApiCall<MyTestController>( x => new Func<int, ActionResult>( x.MyOtherFunction ) );
有没有办法让这个调用自动装箱,所以我不必一直写这个Func包装?