gpt4 book ai didi

c# - 你如何实现可链接的异步扩展方法?

转载 作者:太空宇宙 更新时间:2023-11-03 12:16:08 25 4
gpt4 key购买 nike

我想知道如何在不要求调用者编写多个等待和嵌套括号的情况下编写可链接的异步扩展方法。

例子。假设您的目标是让调用者能够编写此类代码段:

var example = new MyCompilableClass();
await example.Compile().Run();

(注意:我不是在编写编译器。我只是使用这些名称来表明一个必须先于另一个发生)。

为了支持上述内容,您创建了两个接口(interface):

public interface ICompilable
{
Task<IRunnable> CreateExecutableImage();
}

public interface IRunnable
{
Task Execute();
}

您将它们实现为异步:

class SourceCode : ICompilable
{
public async Task<IRunnable> CreateExecutableImage()
{
await Stub.DoSomethingAsynchronous();
return new ObjectCode();
}
}

class ObjectCode : IRunnable
{
public async Task Execute()
{
await Stub.DoSomethingAsynchronous();
}
}

然后用适当的类型约束编写两个扩展方法:

static class ExtensionMethods
{
public static async Task<IRunnable> Compile<T>(this T This) where T : ICompilable
{
return await This.CreateExecutableImage();
}

public static async Task Run<T>(this T This) where T : IRunnable
{
await This.Execute();
}
}

所以现在调用者尝试编译他的代码。但是我们在这一行得到一个错误:

await example.Compile().Run();  //Does not compile

这是编译错误:

The type 'System.Threading.Tasks.Task' cannot be used as type parameter 'T' in the generic type or method 'ExtensionMethods.Run(T)'. There is no implicit reference conversion from 'System.Threading.Tasks.Task' to 'Example.IRunnable'

我们可以用括号修复编译错误:

(await example.Compile()).Run();

...或者两行代码:

var compiled = await example.Compile();
await compiled.Run();

...两者都有效。但是,如果您期待像我们使用 LINQ 那样干净、可链接的语法,那似乎相当不幸。

是否有不同的方法来实现这些扩展方法,使它们保持异步特性,但又不需要丑陋的语法?

这是一个Link to DotNetFiddle如果您想使用我的示例代码。

最佳答案

一个简单的答案就是添加另一个扩展方法来转换 Task<T>T ,像这样:

static class ExtensionMethods
{
public static async Task Run<T>(this T This) where T : IRunnable
{
await This.Execute();
}

public static async Task Run<T>(this Task<T> This) where T : IRunnable
{
////Await the task and pass it through to the original method
await (await This).Execute();
}
}

这将使调用者能够使用

await example.Compile().Run();

...虽然他可能不知道他正在将任务而不是结果传递给Run() (除非他真的这么想)。对他来说应该无关紧要。

关于c# - 你如何实现可链接的异步扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49702254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com