Выражения для идентификации асинхронных методов вызывают предупреждение компилятора - PullRequest
0 голосов
/ 06 октября 2018

Я использую выражение для определения конкретного метода в классе и возврата атрибута метода.Когда метод асинхронный, компилятор выдает мне предупреждение о том, что метод следует ожидать.

Есть ли другие способы, которыми я мог бы идентифицировать метод, или любой способ подавить предупреждение, не используя прагму?Я не хотел бы использовать строку для идентификации метода.

Resharper предлагает async / await, но асинхронное лямбда-выражение не может быть преобразовано в деревья выражений.

Другие ответы - методы расширения для задачи,но тогда я не смог бы получить метод с атрибутом.

Пример кода:

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 голосов
/ 07 октября 2018

Поскольку это просто Action<T>, компилятор видит, что вы вызываете задачу, но ничего с ней не делаете.В этом случае это умышленно, чтобы вы могли проигнорировать предупреждение.Чтобы избежать предупреждения, вы можете добавить перегрузку метода GetAttribute, чтобы получить Func<T,object> вместо Action<T>.

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

Таким образом, компилятор увидит, что вы ожидаете результат (в этом случае Задача) и будет предполагать, что вы будете что-то с этим делать, а не предупреждать о том, что не ожидаете этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...