Ограничение параметров для универсального типа в пользовательском NativeActivity <T> - PullRequest
1 голос
/ 25 октября 2011

Существует ли способ ограничения и / или изменения параметров, предоставляемых пользователю средством выбора универсального типа при добавлении операции общего характера в рабочий процесс?

Мы встраиваем поддержку динамического рабочего процесса в наше приложение, и я собираю набор пользовательских действий для чтения значений из связанных бизнес-объектов в переменные рабочего процесса. Итак, теперь у нас есть такие действия, как ReadDocumentProperty<T> и SetItemProperty<T>

Эти бизнес-объекты содержат определенные пользователем наборы свойств, которые могут быть только одним из нескольких основных типов (целое число, число с плавающей запятой, строка, логическое значение, дата-время или список), поэтому нет смысла раскрывать весь набор. NET типы для клиента на выбор. Еще хуже то, что они, скорее всего, хотят - это System.Double (для сумм счетов и т. Д.), Которого даже нет в списке по умолчанию.

Есть ли способ изменить это приглашение: заменить его, отфильтровать его, предварительно заполнить значения по умолчанию и т. Д., И при этом иметь возможность использовать общее настраиваемое действие?

1 Ответ

1 голос
/ 25 октября 2011

Новый день, новые идеи.Я действительно забыл об этом.

Если вы хотите проверить во время разработки, вполне возможно сделать что-то вроде этого:

public sealed class MyActivity<T> : NativeActivity<T>
    {
        protected override void CacheMetadata(NativeActivityMetadata metadata)
        {
            base.CacheMetadata(metadata);

            if (typeof(T) != typeof(int) &&
                typeof(T) != typeof(bool) &&
                typeof(T) != typeof(DateTime) &&
                typeof(T) != typeof(decimal) &&
                typeof(T) != typeof(string))
            {
                metadata.AddValidationError(
                    "Generic must be 'int', 'DateTime', 'decimal' or 'string'");
            }
        }

        protected override void Execute(NativeActivityContext context)
        {
            // Execution logic 
        }
    }

Это вполне приемлемо, если вы делаете действия доступными дляклиент для разработки собственного рабочего процесса.Но имейте в виду, что это проверка во время разработки .Если кто-то использует вашу деятельность через код, он отлично скомпилируется, но при проверке / выполнении во время выполнения выдает исключительную ситуацию проверки.

Единственный способ ограничения типа для универсального действия - это ключевое слово where, как вы использовали любое другое ограничение универсального типа .

Относительно ВыбратьДиалоговое окно Generic Types , если вы делаете что-то вроде этого:

public sealed ReadDocumentProperty<T> : CodeActivity<T>
    where T : struct
{
    //...
}

Диалог будет фильтровать все типы, кроме struct.Может быть, таким образом System.Double появится в списке по умолчанию, хотя это всего лишь предположение (не проверялось), и, конечно, вы не можете на него полагаться.Более того, если вы впервые выберите тип, которого нет в списке по умолчанию, во второй раз он появится в нем.

Edit :

Для того, что я могу понять, этот парень нашел способ " сократить список" просмотра типов "", хотя он использует рефлексию и находится далеко от линейного, прямого или документированного способаДелать это.Насколько я вижу, это сокращает список для всего редактора, а не для конкретного действия (если учесть, что вы используете редактор с измененным интерфейсом, иначе забудьте об этом)

...