C# 从表达式中提取数据<;Func<&燃气轮机&燃气轮机;

C# 从表达式中提取数据<;Func<&燃气轮机&燃气轮机;,c#,expression,func,C#,Expression,Func,我在从表达式中提取一些数据时遇到了一些麻烦,在解释我想要什么时遇到了更多的麻烦 所以我有一个RESTAPI,我正在构建一个可以像WFC一样工作的方法 这意味着我将不需要通过url调用RESTAPI,而是。 构建一个接口或某种包装器,然后从该接口提取RESTAPI控制器名称、方法和参数 好的,让我告诉你我是如何想象它的 这是我的控制器接口 可以看出,不存在方法搜索,它只是接口中的一个方法 这是一个httphelper,其中存在PostAsync和GetAsync以及ExecuteAsync pr

我在从
表达式
中提取一些数据时遇到了一些麻烦,在解释我想要什么时遇到了更多的麻烦

所以我有一个RESTAPI,我正在构建一个可以像WFC一样工作的方法

这意味着我将不需要通过url调用RESTAPI,而是。 构建一个接口或某种包装器,然后从该接口提取RESTAPI控制器名称、方法和参数

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

这是我的控制器接口

可以看出,不存在方法搜索,它只是接口中的一个方法

这是一个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 )
    }
private静态字符串baseUrl=”http://xxx"
公共静态异步任务

ExecuteAsync(表达式函数) { var url=typeof(T).GetCustomAttribute()?.url???”;//例如api/ var controller=typeof(T).Name;//例如IYoutubeContrller,稍后将重命名为youtube var method=//从func P中获取用于搜索的方法 var parameters=//来自func的参数数据,它是Eminem var fullUrl=$“{baseUrl}/{url}/{controller}” //这里我们做PostAsync

(fullUrl,参数)或GetAsync

(fullUrl,参数) }

HttpHelper ExecuteAsync
中,我想从我的
Func
中检索方法名
Search
和参数
searchString
以及参数值
Eminem

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


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

对于您的非常特殊的案例:

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
}
publicstaticasync任务

ExecuteAsync(expressionfunc) { MethodCallExpression callExpression=expression.Body作为MethodCallExpression; string methodName=callExpression.Method.Name; 对象参数=((ConstantExpression)callExpression.Arguments).Value; //做点什么 }

但是,如果传递给
Execute
的表达式更复杂,或者使用不带参数或非常量表达式参数的调用,那么这当然会崩溃。

但是,在这种情况下,您根本不知道要提取哪些信息。

但是我现在在使用表达式而不是Func
时出现了这个错误。表达式树可能不包含使用可选参数的调用或调用,它不接受参数搜索(“Eminem”)是,对于表达式,需要为
Search
调用提供所有参数。没有看到有更多可选参数。因此,您需要将调用更改为
x.Search(“Eminem”,50,null,VideoSearchType.Videos)
 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 )
    }
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
}