在向工作流添加泛型活动时,是否有办法限制和/或更改泛型类型选择器向用户提供的选项?
我们正在将动态工作流支持嵌入到我们的应用程序中,并且我正在构建一组自定义活动来从关联的业务对象中读取值到工作流变量中。现在我们有了ReadDocumentProperty<T>
和SetItemProperty<T>
这些业务对象包含用户定义的属性集,这些属性集只能是少数基本类型(整数、浮点数、字符串、布尔值、日期时间或列表)中的一种,因此将整个. net类型集公开给客户从中选择是没有意义的。更糟糕的是,他们最有可能想要的是System。两倍(用于发票金额等),甚至不在默认列表中。
是否有任何方法可以改变这个提示:替换它,过滤它,预填充默认值等,并且仍然能够使用通用的自定义活动?
新的一天,新的想法。我真的忘了这个
如果你想在设计时进行验证,完全可以这样做:
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
关键字,就像您使用任何其他泛型类型约束一样。
关于Select Generic Types对话框,如果你这样做:
public sealed ReadDocumentProperty<T> : CodeActivity<T>
where T : struct
{
//...
}
对话框将过滤除struct
以外的所有类型。也许那样系统。双出现在默认列表中,尽管这只是猜测(还没有测试),当然您不能依赖它。此外,如果您第一次选择的类型不在默认列表中,那么第二次它将出现在默认列表中。
编辑:
就我所能理解的,这家伙找到了一种方法来"减少"浏览类型"列表",尽管他使用反射,并不是一个线性的,直接的或文档化的方法。我所看到的是,它减少了所有编辑器的列表,而不是针对特定的活动(计算您正在使用重托管编辑器,否则忘记这个)