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
}