C# 构建一个任务<;TResult>;要用作返回值的类型
假设我有两种方法:C# 构建一个任务<;TResult>;要用作返回值的类型,c#,.net,C#,.net,假设我有两种方法: public async Task<int> Foo() { return Datetime.Now.Second; } public async Task<string> Bar() { return "222"; } //使用缓存属性,结果可以是一个特定的值,如10。然后,我可以在不改变调用方行为的情况下向任何方法添加缓存功能。我已经通过使用dynamic关键字解决了这个问题 示例代码: if (context.IsAsync()) {
public async Task<int> Foo()
{
return Datetime.Now.Second;
}
public async Task<string> Bar()
{
return "222";
}
//使用缓存属性,结果可以是一个特定的值,如10。然后,我可以在不改变调用方行为的情况下向任何方法添加缓存功能。我已经通过使用dynamic关键字解决了这个问题 示例代码:
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);
}
返回一个KeyValuePair您能解释一下您想要实现的目标吗?在我看来,这是一个糟糕的建筑。但也许你想要这个有一个很好的理由?你的问题不清楚。请包含一些具有预期输出的场景,更重要的是一些您尝试过的代码。我想通过cachingatAttribute缓存方法的返回值。听起来您想使用反射调用
Task.FromResult(value)
。看看。为什么要使用动态?这似乎可以通过反思来实现。你真的应该在你的问题中提供一个答案。然后我们就可以很容易地回答了,而不需要黑魔法,呃,动态的。我还认为我可以通过使用反射来解决这个问题,但我做不到。搜索后,我发现也许我可以在这里使用动态关键字。您没有得到答案,因为您没有提供一个动态关键字。就这么简单。你发布的答案不是最好的。你真的应该重新考虑发布最小的代码我在我的场景中使用了很多第三方库。因此,我很难生成一个最小的、完整的、可验证的示例。为了得到一些帮助,我别无选择,只有示例代码。然后我们很难给你一个答案。你真的应该花点时间,不管有多难,给我一个机会。
Context.ReturnValue = Task<string>.FromResult("333");
[CachingAttribute]
public async Task<int> Foo(){return 1;}
var result = await Foo();
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);
}