系统在 C# 中提供的工作流活动的 GUID

本文关键字:工作流 活动 GUID 系统 | 更新日期: 2023-09-27 18:34:14

有没有办法在重新承载的工作流设计器中为系统活动提供 GUID?

我希望为我创建的每个活动以及提供的系统(分配、为、切换等(提供一个 GUID。

我已经读过IAttachedPropertyStore是要走的路,但我认为没有一个系统提供的活动来实现这些。http://blogs.msdn.com/b/bursteg/archive/2009/05/18/xaml-in-net-4-0-attached-properties-iattachedpropertystore-and-attachablepropertyservices.aspx

欢迎任何建议或想法。这些 GUID 是将这些流导入其他工具并能够对其进行修改所必需的。

请询问是否需要任何其他信息来回答这个问题。

系统在 C# 中提供的工作流活动的 GUID

如果只需要从活动到 Guid 的 1:1 映射,请考虑仅对程序集限定名称进行哈希处理。 有了这么小的输入集,我猜你不会在 16 字节的哈希中发生冲突。

var targetAssemblies = new[] { typeof(Activity).Assembly };
var knownActivities = new Dictionary<Guid, Type>();
var baseType = typeof(Activity);
var sha1 = new SHA1CryptoServiceProvider();
foreach (var t in targetAssemblies.SelectMany(a => a.GetTypes()))
{
    if (t.IsPublic && !t.IsAbstract && baseType.IsAssignableFrom(t))
    {
        var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(t.AssemblyQualifiedName));
        // hash is 20 bytes long, we are truncating it to 16 to fit the guid
        var guidData = new byte[16];
        Buffer.BlockCopy(hash, 0, guidData, 0, 16);
        var typeGuid = new Guid(hash.Take(16).ToArray());
        if (knownActivities.ContainsKey(typeGuid))
        {
            throw new InvalidOperationException("Collision");
        }
        knownActivities.Add(typeGuid, t);
    }
}