我有一个 Windows Workflow Foundation 4.5 WCF 工作流服务应用程序。我正在尝试Dictionary<IEdmEntityType, DataTable>
从我的CodeActivity<Dictionary<IEdmEntityType, DataTable>>
. 代码不会遇到编译时错误,但 XAML 无法编译。
我的 XAML 的相关部分如下所示:
我们有序列的变量声明,我试图转储我的返回值。我们试图分配的变量被称为EntityTableRelationships
.
<p1:Sequence.Variables>
<p1:Variable x:TypeArguments="x:String" Name="MetadataContent" />
<p1:Variable x:TypeArguments="scg:Dictionary(mde:IEdmEntityType, sd:DataTable)" Name="EntityTableRelationships" />
</p1:Sequence.Variables>
还有,从我们被分配到OutArgument
的返回值。Execute
CodeActivity<..>
EntityTableRelationships
<o:TransformMetadataToTables.Result>
<p1:OutArgument x:TypeArguments="scg:Dictionary(mde:IEdmEntityType, sd:DataTable)">
<mca:CSharpReference x:TypeArguments="scg:Dictionary(mde:IEdmEntityType, sd:DataTable)">EntityTableRelationships</mca:CSharpReference>
</p1:OutArgument>
</o:TransformMetadataToTables.Result>
产生的 XAML 验证错误是:
Type 'http://schemas.microsoft.com/netfx/2009/xaml/activities:OutArgument(Dictionary)' is not assignable to type 'http://schemas.microsoft.com/netfx/2009/xaml/activities:OutArgument(Dictionary)' of member 'EntityTableRelationships'.
最初我以为我输入了错误的返回值,或者我引用了一个同名但在不同命名空间中的接口。不是这种情况。
我的另一个想法是,工作流程可能不适用于任何Dictionary<TKey, TValue>
声明TKey
为任何接口。我做了一个测试用例,它工作得很好。我还按顺序将该步骤添加到设计器中,就像这里所做的那样。我没有尝试使用IEdmEntityType
as the TKey
,但没有理由,我可以看到,为什么它应该有所不同。
这可能是什么原因,我该如何解决?
编辑#1
进一步的研究表明,这DataTable
是罪魁祸首。DataSet
也有问题。我能看到这些类型的唯一独特之处是它们继承自MarshalByValueComponent
其中具有 a TypeConverterAttribute
。这TypeConverter
可能会影响 XAML 序列化绑定程序并导致问题,因此表明 WF 4.5 中存在错误。但是,我不敢说这是一个错误。
Dictionary<TKey, DataTable>
似乎不能通过设计器在 WF 4.5 中传递。
编辑#2
似乎它可能与或可能没有任何关系DataTable
。你也不能绕过Dictionary<IEdmEntityType, object>
。
System.Data
为了尝试使用之外的类重现该问题System.Object
,我创建了一个新的工作流项目。
我创建了自己的接口、类和结构,以查看是否有任何东西会触发它再次中断。
我没有使用IEdmEntityType
,而是将IMyInterface
其定义为:
public interface IMyInterface
{
int Id
{
get;
}
}
该MyStruct
结构工作正常。这是定义:
public struct MyStruct
{
public int A;
public int B;
}
这MyClass
门课做得很好。这是定义:
public class MyClass
{
public int A;
public int B;
}
MyClassComplex
具有自动属性和对 an 的引用object
也有效。
public class MyClassComplex
{
public int A
{
get;
private set;
}
public int B
{
get;
private set;
}
public object C
{
get;
private set;
}
}
本来我也觉得可能和 and 之间的共同属性有关系DataTable
,DataSet
所以我把它们加到了 中MyClassComplex
,但还是没问题。
此外,我MyClassComplex
继承自MarshalByValueComponent
,并且没有奇怪的交互,再次没有错误。
我采用了同一个项目,只是将我的变量设置为 aDictionary<IMyInterface, DataTable>
并将其更改CodeActivity<IMyInterface, MyClassComplex>
为CodeActivity<IMyInterface, DataTable>
,它给出了与我原来的非测试项目中相同的错误。
编辑#3
由于我已经对此进行了测试并在单独的项目和同事的机器上重现了该问题,并且没有文档支持为什么这不起作用,因此我已在 MS Connect 上提交了错误报告