限制自定义NativeActivity <t> </t>中泛型类型的选项

时间:2011-10-24 20:38:50

标签: generics workflow-foundation-4 workflow-activity

在向工作流程添加通用活动时,是否有办法限制和/或更改通用类型选择器向用户显示的选项?

我们正在将动态工作流支持嵌入到我们的应用程序中,并且我正在构建一组自定义活动,以将关联业务对象中的值读取到工作流变量中。所以,现在我们开展了ReadDocumentProperty<T>SetItemProperty<T>

等活动

这些业务对象包含用户定义的属性集,这些属性集只能是少数基本类型之一(整数,浮点数,字符串,布尔值,日期时间或列表),因此公开整个集合是没有意义的。 NET类型给客户挑选。更糟糕的是,他们最有可能想要的是System.Double(用于发票金额等),而且甚至不在默认列表中。

有没有办法更改此提示:替换它,过滤它,预先填充默认值等,仍然可以使用通用的自定义活动?

1 个答案:

答案 0 :(得分:1)

新的一天,新的想法。我真的忘了这个。

如果你想在设计时进行验证,完全有可能做到这样的事情:

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 type constraint一样。

关于选择通用类型对话框,如果您执行以下操作:

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

该对话框将过滤除struct之外的所有类型。也许那样 System.Double 出现在默认列表中,虽然这只是一个猜测(没有测试它),当然你不能依赖它。此外,如果你第一次选择一种类型,它不在默认列表中,第二次就会出现在它上面。

修改

我能理解的是,这个家伙找到了一种“ reduce the "browse for types" list ”的方法,尽管他使用的是反射,并且远不是线性的,直接的或有记录的方式。我可以看到它减少了所有编辑器的列表,而不是特定的活动(计算你正在使用重新托管的编辑器,否则忘记这一点)