将类方法名称作为lambda表达式传递

时间:2014-02-12 21:32:32

标签: c# reflection interface lambda delegates

我正在为具有各种安全要求的各种客户端编写一些api调用的插件框架,以收集各种特定于业务的数据。所有插件都实现IApiServiceEntryPoint,如下所示:

public interface IApiServiceEntryPoint : IDisposable
{
    /// <summary>
    /// Gets the name of the API Plugin
    /// </summary>
    string Name { get; }

    /// <summary>
    /// Registers the assembly in the application, sets up the routes, and enables invocation of API requests
    /// </summary>
    void Register();

    /// <summary>
    /// Gets the routing namespace of the plugin
    /// </summary>
    string UrlNameSpace { get; }

    /// <summary>
    /// Validates the user is authorized to invoke the supplied method.
    /// </summary>
    /// <param name="methodName"></param>
    bool IsAuthorized(string methodName);

    /// <summary>
    /// The user initiating the API call
    /// </summary>
    IPrincipal User { get; }
}

请注意IsAuthorized方法。我的目的是允许插件确定特定的IPrincipal是否有权调用具体类中的特定方法。使用字符串有效,但我宁愿更具体和可重构;例如,使用lambda表达式。

目前,我可以在我的API控制器中执行类似的操作:

    [HttpGet]
    public DateTime GetSystemTimeStamp()
    {
        if (IsAuthorized("GetSystemTimeStamp"))
        {
            return DateTime.UtcNow;
        }
        throw new AuthorizationException();
    }

我想做的是这样的事情:

   [HttpGet]
    public DateTime GetSystemTimeStamp()
    {
        if (IsAuthorized(me => me.GetSystemTimeStamp))
        {
            return DateTime.UtcNow;
        }
        throw new AuthorizationException();
    }

我如何在我的界面中声明,以及如何在IsAuthorized方法中提取方法的名称以检查授权?

1 个答案:

答案 0 :(得分:5)

你不需要lambda;您可以直接将该方法作为委托传递:

public bool IsAuthorized<T>(Func<T> method) {
    string name = method.Method.Name;
}
if (IsAuthorized(GetSystemTimeStamp))

您希望接受的每个方法都需要单独的Func<,,,T>重载;他们都可以简单地称为Delegate的常用方法 或者,您可以只创建一个采用Delegate的方法,然后在每个调用点显式创建一个委托。