我正在寻找有关如何处理以下情况的建议。
我正在创建尝试获取某些数据的方法,遵循以下模式:
// Typical pattern
public bool TryBlah(string key, out object value)
{
// ... set value and return boolean
}
我在尝试在它们的异步版本上遵循此模式时遇到了一个问题,因为您不能out
在异步方法上使用:
// Ideal async pattern (not allowed to use an 'out' parameter, so this fails)
public async Task<bool> TryBlah(string key, out object value)
{
// ... set value, perform some slow io operation, return bool
}
一种解决方法是返回一个包含您的数据的元组。这适用于返回单一数据类型的方法,如下所示:
// Tuple version
public async Task<Tuple<bool, object>> TryBlah(string key)
{
// ... perform some slow io, return new Tuple<bool, object>(...)
}
问题是当您想要返回不同的数据类型时。如果不使用 async,您可以创建几个具有几乎相同签名的方法,如下所示:
public bool TryBlah(string key, out byte[] value)
{
// ...
}
public bool TryBlah(string key, out string value)
{
// ...
}
那太棒了。这就是我想要做的。这个api非常简单易用(方法名都是一样的,只是传入的数据有变化)。
但是,无法使用out
异步方法会搞砸。
解决此问题的一种方法是返回Tuple
您的数据。但是,现在您不能拥有几乎相同的方法签名,如下所示:
// The suck... the signatures match, but you want to return different values.
// You can't do this:
public async Task<Tuple<bool, byte[]>> TryBlah(string key)
{
// ...
}
public async Task<Tuple<bool, string>> TryBlah(string key)
{
// ...
}
这些方法失败是因为它们具有相同的签名。解决这个问题的唯一方法是给每个方法一个不同的名称,如下所示:
public async Task<Tuple<bool, byte[]>> TryBlahByteArray(string key)
{
// ...
}
public async Task<Tuple<bool, string>> TryBlahString(string key)
{
// ...
}
我的问题是,这现在创建了我认为令人讨厌的 api,您现在有很多不同的方法。是的,这不是什么大问题,但我觉得必须有更好的方法。
在使用这样的异步方法时,是否还有其他模式可以提供更好的 api?我愿意接受任何建议。