标识异步方法的表达式导致编译器警告

时间:2018-10-06 20:23:52

标签: c# asynchronous expression

我正在使用表达式来标识类中的特定方法,并返回该方法的属性。当方法异步时,编译器会警告我应等待该方法。

在不使用编译指示的情况下,我还有其他方法可以识别该方法或抑制警告吗?我不想使用字符串来标识方法。

Resharper建议使用异步/等待,但是异步lambda表达式无法转换为表达式树。

其他答案是任务的扩展方法,但是那样我将无法获得带有属性的方法。

示例代码:

class Program
{
    static void Main(string[] args)
    {
        var attributeProvider = new AttributeProvider();
        var attributeText = attributeProvider.GetAttribute<Program>(
            p => p.MethodA()); //Warning: Because this call is not awaited, ...
    }

    [Text("text")]
    public async Task<string> MethodA()
    {
        return await Task.FromResult("");
    }
}

public class AttributeProvider
{
    public string GetAttribute<T>(Expression<Action<T>> method)
    {
        var expr =(MethodCallExpression) method.Body;

        var attribute = (TextAttribute)Attribute.GetCustomAttribute(
            expr.Method, typeof(TextAttribute));

        return attribute.Text;
    }
}

public class TextAttribute : Attribute
{
    public string Text { get; set; }

    public TextAttribute(string text)
    {
        Text = text;
    }
}

1 个答案:

答案 0 :(得分:1)

由于它只是一个Action<T>,因此编译器会看到您正在调用Task,但未对其执行任何操作。在这种情况下,这是有意的,因此您可以忽略该警告。为避免警告,您可以添加GetAttribute方法的重载以使用Func<T,object>代替Action<T>

public string GetAttribute<T1>(Expression<Func<T1,object>> method)

这样,编译器将看到您正在期待一个结果(在本例中为Task),并且会假定您将对其执行某些操作,而不会警告您不要等待它。