在向工作流程添加通用活动时,是否有办法限制和/或更改通用类型选择器向用户显示的选项?
我们正在将动态工作流支持嵌入到我们的应用程序中,并且我正在构建一组自定义活动,以将关联业务对象中的值读取到工作流变量中。所以,现在我们开展了ReadDocumentProperty<T>
和SetItemProperty<T>
这些业务对象包含用户定义的属性集,这些属性集只能是少数基本类型之一(整数,浮点数,字符串,布尔值,日期时间或列表),因此公开整个集合是没有意义的。 NET类型给客户挑选。更糟糕的是,他们最有可能想要的是System.Double(用于发票金额等),而且甚至不在默认列表中。
有没有办法更改此提示:替换它,过滤它,预先填充默认值等,仍然可以使用通用的自定义活动?
答案 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 ”的方法,尽管他使用的是反射,并且远不是线性的,直接的或有记录的方式。我可以看到它减少了所有编辑器的列表,而不是特定的活动(计算你正在使用重新托管的编辑器,否则忘记这一点)