构造一个Task <tresult>类型以用作返回值

时间:2018-03-08 07:43:12

标签: c# .net

假设我有两种方法:

public async Task<int> Foo()
{
  return Datetime.Now.Second;
}

public async Task<string> Bar()
{
  return "222";
}

还有一个上下文,其中包含有关方法的一些信息:

Context.ReturnValue,对于Foo()为Task<int>,对于Bar()为Task<string>

我调用的方法的Context.MethodInfo MethodInfo。

我想做的是一些模拟的事情,比如我想根据Context.MethodInfo.ReturnType的类型为Foo()方法返回2.

Context.ReturnValue = Task<int>.FromResult(2);

我也希望这个解决方案用于Bar():

Context.ReturnValue = Task<string>.FromResult("333");

所以问题是如何构建基于Task<TResult>变量的[CachingAttribute] public async Task<int> Foo(){return 1;} 变量 Context.MethodInfo.ReturnType和value。

为什么我要这样做是因为我想通过CachingAttribute缓存方法的返回结果。

var result = await Foo();

此属性可以自动处理以下事项:

  1. 检查缓存提供程序中的缓存值,如redis。
  2. 如果存在,则处理返回值。 (此问题存在于此处)
  3. 如果没有,请执行该方法并将返回值放入缓存提供程序。
  4. 然后在使用中。 当我们调用Foo方法时:

    List<String> listCopyLastPrice1 = new ArrayList<String>();
    List<WebElement> listOfLastPrice1 = driver.findElements(By.cssSelector("[data-column-name='last'][class*='pid']"));
    for(WebElement elem:listOfLastPrice1)
        listCopyLastPrice1.add(elem.getAttribute("innerHTML"));
    System.out.println(listCopyLastPrice1);
    

    //使用缓存属性,结果可以是10之类的特定值。然后,我可以将缓存功能添加到我想要的任何方法而不改变调用者的行为。

1 个答案:

答案 0 :(得分:-1)

我已经使用动态关键字解决了这个问题。

示例代码:

if (context.IsAsync())
{
    dynamic member = context.ServiceMethod.ReturnType.GetMember("Result")[0];
    dynamic temp = System.Convert.ChangeType(result, member.PropertyType);
    context.ReturnValue = System.Convert.ChangeType(Task.FromResult(temp), context.ServiceMethod.ReturnType);
}