use*_*899 5 c# expression asynchronous
我正在使用表达式来标识类中的特定方法,并返回该方法的属性。当方法是异步的时,编译器会警告我应该等待该方法。
有没有其他方法可以识别该方法,或者有什么方法可以在不使用 pragma 的情况下抑制警告?我不想使用字符串来标识该方法。
Resharper 建议使用 async/await,但是 async 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;
}
}
Run Code Online (Sandbox Code Playgroud)
由于它只是一个Action<T>
,编译器会看到您正在调用一个任务,但没有对其执行任何操作。在本例中,这是故意的,因此您可以忽略该警告。为了避免出现警告,您可以添加 GetAttribute 方法的重载以Func<T,object>
采用Action<T>
.
public string GetAttribute<T1>(Expression<Func<T1,object>> method)
Run Code Online (Sandbox Code Playgroud)
这样,编译器就会看到您正在期待一个结果(在本例中是一个任务),并假设您将对其执行某些操作,并且不会警告您不等待它。
归档时间: |
|
查看次数: |
462 次 |
最近记录: |