Можно ли использовать атрибуты метода, чтобы изменить способ запуска этого метода? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть этот метод:

public object LongRunningTask()
{
    return SomethingThatTakesTooLong();
}

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

public async Task<object> LongRunningTaskAsync()
{
    Exception ex = null;
    object ret = await Task.Run(() =>
    {
        object r = null;
        try
        {
            //The actual body of the method
            r = SomethingThatTakesTooLong();
        }
        catch (Exception e)
        {
            ex = e;
        }
        return r;
    });

    if (ex == null)
        return ret;
    else
        throw ex;
}

Когда мне нужно сделать это несколькими способами, я должен скопировать весь этот код и изменить только середину.

Есть ли способ сделать что-то подобное?

[SomeAttributeThatDoesThatMagically]
public async Task<object> LongRunningTaskAsync()
{
    return SomethingThatTakesTooLong();
}

1 Ответ

0 голосов
/ 16 мая 2018

Атрибуты, как правило, являются метаданными, хотя можно определить атрибуты, которые могут быть выполнены (например, режимы безопасности в WCF), однако сначала нужно что-то искать.Ваши атрибуты не будут волшебным образом работать.

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

Посмотрите, как WCF работает для идей.

...