Как реализовать TypeArgument для пользовательского действия рабочего процесса, чтобы установить известный тип

Попытка создать пользовательское действие для выполнения вызовов REST (получить, опубликовать, поместить, удалить) в библиотеке рабочих процессов и сделать его достаточно универсальным, чтобы принимать любой URL-адрес и т. д.

Я хочу иметь возможность установить тип возврата при удалении этого действия в конструкторе, как это делает Foreach или Switch.

Как реализовать этот бит?


person DavieDave    schedule 13.08.2014    source источник


Ответы (1)


Что ж, это тривиальный и распространенный сценарий в мире WF.

Просто сделайте его обычным Activity‹TResult› (или один из его унаследованных классов: CodeActivity‹TResult ›, NativeActivity‹TResult› и т. д.), где TResult — тип возвращаемого значения. Дизайнер позаботится о том, чтобы запросить у пользователя тип TResult.

public class MyCustomActivity<TResult> : CodeActivity<TResult>
{
    protectd override T Execute(CodeActivityContext context)
    {
        // Do something and return TResult
        return default(TResult);
    }
}

Обратите внимание, что дизайнер запросит не только тип TResult, но и любой указанный универсальный тип. У вас также могут быть, например, общие InArguments:

public sealed class MyCustomActivity<TInArgument, TResult> : CodeActivity<TResult>
{
    public InArgument<TInArgument> GenericInArg { get; set; }

    protected override T Execute(CodeActivityContext context)
    {
        var g = GenericInArg.Get(context);

        Console.WriteLine("GenericInArg: " + g);

        return default(TResult);
    }
}
person Joao    schedule 13.08.2014
comment
Ок, отлично. Дополняющий вопрос. Что, если я хочу также передать тип TResult в метод как тип. т. е. внутри Execute есть метод Blah.Go‹TResult›(yeah); Как сделать так, чтобы TResult разрешался во время компиляции? - person DavieDave; 13.08.2014
comment
Извините, не могу понять ваш вопрос. Что означает передача типа TResult в метод? TResult не является значением или экземпляром чего-либо, это просто параметр. Вы можете передать параметр типа указанному методу так же, как вы его написали: Blah.Go<TResult>() - person Joao; 14.08.2014
comment
да, моя проблема, похоже, заключается в том, что есть метод where T: Class on the Go от Blah. Что ограничивает меня от этого. Я его удаляю. - person DavieDave; 14.08.2014