使用Lambda表达式获取方法名称

awi*_*nsk 17 c# reflection lambda

我正在尝试使用lambda表达式获取类型的方法名称.我正在使用Windows Identity Foundation,需要定义具有类型名称的访问策略,其中命名空间作为资源,方法名称作为操作.这是一个例子.

这是我将从以下类型获取类型名称和方法名称的类型:

namespace My.OrderEntry {
    public class Order {
        public void AddItem(string itemNumber, int quantity) {}
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我想通过DSL定义访问策略的方法:

ForResource<Order>().Performing(o => o.AddItem).AllowUsersHaving(new Claim());
Run Code Online (Sandbox Code Playgroud)

从该声明中,我想将"My.OrderEntry.Order"作为资源,将"AddItem"作为动作.获取带有命名空间的类型名称是没有问题的,但我认为我不能将lambda用于我正在尝试的方法.

public static IPermissionExp Performing<T>(
    this IActionExp<T> exp,
    Func<T, delegate???> action) {} //this is where I don't know what to define
Run Code Online (Sandbox Code Playgroud)

这种事情甚至可能吗?有没有其他方法可以在不使用魔术字符串的情况下完成此类操作?

SLa*_*aks 7

有两种方法可以做到这一点:

1:您可以进行带有各种FuncAction委托的重载(例如Expression<Func<T, Func<TParam1,TParam2, TReturn>>,请注意,您的调用者需要在方法调用中或通过创建委托来显式指定泛型参数.这将使用如下:

ForResource<Order>().Performing(o => new Action<string>(o.AddItem)).AllowUsersHaving(new Claim());
Run Code Online (Sandbox Code Playgroud)

2:你可以使用Expression<Action>包含方法调用的方法,并MethodInfo从表达式树中解析出被调用的方法.这将使用这样:

ForResource<Order>().Performing(o => { o.AddItem(null); }).AllowUsersHaving(new Claim());
Run Code Online (Sandbox Code Playgroud)