C# 使用Lambda表达式选择类方法名称
目前在我的代码中,我有这样一个方法:C# 使用Lambda表达式选择类方法名称,c#,linq,reflection,lambda,C#,Linq,Reflection,Lambda,目前在我的代码中,我有这样一个方法: .AddMethod(nameof(IRoleService.GetRoles)) 我要做的是使用lambda表达式选择接口方法,然后在AddMethod中获取方法的名称。 因此,结果将是: .AddMethod<IRoleService>(x=> x.GetRoles) .AddMethod(x=>x.GetRoles) 我试过这个: AddMethod<T>(Expression<Func<T, Actio
.AddMethod(nameof(IRoleService.GetRoles))
我要做的是使用lambda表达式选择接口方法,然后在AddMethod中获取方法的名称。
因此,结果将是:
.AddMethod<IRoleService>(x=> x.GetRoles)
.AddMethod(x=>x.GetRoles)
我试过这个:
AddMethod<T>(Expression<Func<T, Action>> expression);
AddMethod(表达式);
但问题是有些接口方法有我试图忽略的输入参数,因为我只需要方法名。
如果你能帮我,我会很感激的
亚历克斯
但问题是有些接口方法有输入参数
我试图忽略它
不能忽略输入参数,除非这些参数具有默认值
如果您无法更改代码来为这些方法的输入参数设置默认值,那么您需要自己使用反射来提供默认值,以获取所谓的输入参数并为它们提供一些值。或者,您可以在编译时提供:
// I don't know which parameters accept your methods...
AddMethod<IRoleService>(x => x.GetRoles("arg1", 2));
//我不知道哪些参数接受您的方法。。。
AddMethod(x=>x.GetRoles(“arg1”,2));
奥普说。。。
考虑到我只需要方法名,您是否建议一种干净的方法 在不传递参数的情况下获取名称 这样做没有肮脏或干净的方式。表达式树仍然是有效的代码(即,它应该是可以构建到可执行代码中的代码)
如何生成一个表达式树,在其中访问方法名而不是调用它?或者如果整个方法都有参数,如何访问一个方法来调用它而不带参数?这是有效的C代码吗?答案是否这可以通过对
LambdaExpression
进行一点挖掘来实现,如下所示:
string GetMethodCallName(LambdaExpression expression)
{
var unary = (UnaryExpression)expression.Body;
var methodCall = (MethodCallExpression)unary.Operand;
var constant = (ConstantExpression)methodCall.Object;
var memberInfo = (MemberInfo)constant.Value;
return memberInfo.Name;
}
不幸的是,GetMethodCallName
无法使用所需的x=>x.GetRoles
语法直接调用,因为没有类型参数来定义x
是什么。这意味着您需要为Action
和Func
要支持的每个输入参数创建一个AddMethod
重载:
void AddMethod<T>(Expression<Func<T, Action>> expression);
void AddMethod<T, Arg1>(Expression<Func<T, Action<Arg1>>> expression);
void AddMethod<T, Arg1, Arg2>(Expression<Func<T, Action<Arg1, Arg2>>> expression);
void AddMethod<T, TResult>(Expression<Func<T, Func<TResult>>> expression);
void AddMethod<T, Arg1, TResult>(Expression<Func<T, Func<Arg1, TResult>>> expression);
void AddMethod<T, Arg1, Arg2, TResult>(Expression<Func<T, Func<Arg1, Arg2, TResult>>> expression);
然后可以调用AddMethod
,并指定方法的包含类型以及返回和输入类型:
.AddMethod<IRoleService>(x => x.GetRoles);
.AddMethod<IRoleService, TResult>(x => x.GetRoles);
.AddMethod<IRoleService, Arg1, TResult>(x => x.GetRoles);
.AddMethod(x=>x.GetRoles);
.AddMethod(x=>x.GetRoles);
.AddMethod(x=>x.GetRoles);
其中:
是TResult
的返回类型。GetRoles
是Arg1
.GetRoles
操作
(无输入参数)一起工作,但如果某个方法具有您在问题中所述的输入参数,会发生什么情况?
.AddMethod<IRoleService>(x => x.GetRoles);
.AddMethod<IRoleService, TResult>(x => x.GetRoles);
.AddMethod<IRoleService, Arg1, TResult>(x => x.GetRoles);