从Expression <Func <,>>提取数据

时间:2019-06-25 12:31:46

标签: c# expression func

我在从export class CaseListComponent implements OnInit { counter = 1; cases; interval; image: string; array = []; mouseEnter(url: string, url2: string, url3: string, name: string) { clearInterval(this.interval); this.array = [url, url2, url3]; this.image = this.array[0]; this.changeImage(); } changeImage() { this.interval = setInterval(() => { this.image = this.array[this.counter]; this.counter = this.counter === 2 ? 0 : this.counter + 1; }, 300); } mouseLeave() { clearInterval(this.interval); this.image = null; this.highlightedItem = null; } constructor(private casesService: CasesService) {} ngOnInit() { this.cases = this.casesService.data; } } 提取一些数据方面遇到了一些麻烦,并且在解释我想要的内容时遇到了更多麻烦。

所以我有一个REST API,并且正在构建一种可以用作WFC的方法。

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

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

  

这是我的控制器界面

<div class="container-fluid d-flex justify-content-center">

  <div class="row">
    <div class="col-12 text-center" *ngFor="let case of cases" [class.z-index]="highlightedItem === case.name">
      <p class="d-inline-block" routerLink="/cases/{{ case.id }}" (mouseenter)="mouseEnter(case.image, case.image2, case.image3, case.name)" (mouseleave)="mouseLeave()"
         [style.color]="highlightedItem !== case.name && highlightedItem !== null ? '#f1f1f1' : '#33393D'">{{ case.name }}</p>
    </div>
  </div>

  <img *ngIf="!!image" [src]="image" alt="image" class="position-fixed align-self-center">

</div>
  

这是控制器存储库

Expression<Func<,>>

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

[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);
}

您可以确定不存在方法seach,它只是接口中的一个方法。

这是一个httphelper,其中存在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")); 以及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>以及参数值{ {1}}

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

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

1 个答案:

答案 0 :(得分:1)

对于您的非常特殊案例:

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的表达式更复杂,或者使用没有参数或非常数表达式参数等的调用,这当然会崩溃。
但是在那种情况下,您根本不会知道要提取哪些信息。