首页 > 解决方案 > 从表达式中提取数据>

问题描述

我在从中提取一些数据时遇到了一些麻烦Expression<Func<,>>,并且在解释我想要的内容时遇到了更多麻烦。

所以我有一个休息 API,我正在构建一个可以作为 WFC 工作的方法。

这意味着我不需要通过 url 调用其余的 api。构建一个接口或某种包装器,然后从该接口中我们可以提取其余 api 控制器名称、方法和参数。

好的,让我告诉你我想象它是如何工作的。

这是我的控制器界面

[Route(url: "api/")]
public interface IYoutubeController
{
    /// <summary>
    /// Get a collection of the searched youtube videos
    /// </summary>
    /// <param name="searchString"></param>
    /// <param name="pageSize"></param>
    /// <param name="relatedTo"></param>
    /// <param name="videoSearchType"></param>
    /// <returns></returns>
    [Route]
    YoutubeVideoCollection Search(string searchString, int pageSize = 50, string relatedTo = null, VideoSearchType videoSearchType = VideoSearchType.Videos);

    /// <summary>
    /// Get the playlist video contents
    /// </summary>
    /// <param name="playListId"></param>
    /// <returns></returns>
    [Route]
    List<YoutubeItem> Playlist(string playlistId);

    /// <summary>
    /// decrypted youtube video
    /// </summary>
    /// <param name="videoId"></param>
    /// <returns></returns>
    [Route(httpMethod: HttpMethod.POST)]
    Task<YoutubeVideoInfo> GetVideoAsync(string videoId);
}

这是控制器存储库

public static class ControllerRepository
{
    public static async Task<P> Execute<P>(Expression<Func<IYoutubeController, P>> func)
    {
        return await HttpHelper.ExecuteAsync(func);
    }
}

现在我可以像这样简单地调用我的方法

 YoutubeVideoCollection test = await ControllerRepository.Execute(x => x.Search("Eminem"));

您可以看到没有方法存在,它只是接口中的一个方法。

这是一个httphelper,它存在PostAsync并且GetAsync还有ExecuteAsync

 private static string baseUrl = "http://xxx"
 public static async Task<P> ExecuteAsync<T, P>(Expression<Func<IYoutubeController, P>> func) 
    {
        var url= typeof(T).GetCustomAttribute<Route>()?.Url ?? ""; // eg api/
        var controller = typeof(T).Name; // eg IYoutubeContrller, will be renamed to youtube later on
        var method = // get the method from func P which is Search
        var parameters = // the parameter data from func which is Eminem
        var fullUrl= $"{baseUrl}/{url}/{controller}" 
        // and here we do PostAsync<P>(fullUrl, parameters ) Or GetAsync<P>(fullUrl, parameters )
    }

HttpHelper ExecuteAsync我想从我Func<T, P>的方法名称Search和参数中检索,以及参数searchString的值是Eminem

你能帮我从func参数中检索这些信息吗?

这仍然是一个想法,所以它可能不会真正起作用,如果可能的话,请告诉我。

标签: c#expressionfunc

解决方案


对于您的特殊情况:

Execute(x => x.Search("Eminem"));

你可以这样做

public static async Task<P> ExecuteAsync<T, P>(Expression<Func<IYoutubeController, P>> func)
{    
    MethodCallExpression callExpression = expression.Body as MethodCallExpression;
    string methodName = callExpression.Method.Name;
    object argument = ((ConstantExpression)callExpression.Arguments).Value;
    // do something
}

Execute但是,如果传递给的表达式更复杂或使用不带参数的调用或非常量表达式参数等,这当然会崩溃。
但在这种情况下,您根本不知道要提取哪些信息。


推荐阅读