gpt4 book ai didi

.net - 如何在通用配置中指定WCF已知类型?

转载 作者:行者123 更新时间:2023-12-04 04:58:32 25 4
gpt4 key购买 nike

我有一个类型,我们称它为Data<TKey>。我还有一个WCF服务契约(Contract),该契约(Contract)接受一个类型为Wrapper的属性(我们称其为Object)(出于我不愿讨论的原因,这不是可选的)。

[DataContract]
public class Data<TKey> { ... }

[DataContract]
public class Wrapper
{
[DataMember]
public object DataItem { get; set; }
}

现在,我要发送两个类 IntDataLongData:
[DataContract]
public class IntData : Data<int> { /*empty*/ }

[DataContract]
public class LongData : Data<long> { /*empty*/ }

它们都在已知类型的配置文件中配置。该配置类似于以下内容:
<configuration>
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="Wrapper, TheirAssembly">
<knownType type="IntData, MyAssembly"/>
<knownType type="LongData, MyAssembly"/>
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
</configuration>

至此,一切正常。

但是我将要添加第三种类型,并且我不希望拥有不必要的,空的.NET类 IntDataLongData。它们之所以存在是因为...

我不知道如何在WCF配置中指定泛型类型!

我想做这样的事情,但是不知道确切的语法。
<configuration>
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="Wrapper, TheirAssembly">
<!-- this syntax is wrong -->
<knownType type="Data{System.Int32}, MyAssembly"/>
<knownType type="Data{System.Int64}, MyAssembly"/>
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
</configuration>

正确的语法是什么?

(也请注意,我不能将 [KnownType(...)]属性放在 Wrapper上,因为它不是我的类型。配置似乎是唯一的方法。)

编辑

@baretta的答案很好。但是请注意,最初我收到此错误:

Type 'MyAssembly.Data`1[System.Int64]' cannot be added to list of known types since another type 'MyAssembly.Data`1[System.Int32]' with the same data contract name 'http://www.mycompany.com/MyAssembly:Data' is already present.



我没有在原始问题中提到它,但是我的类型有一个明确的数据契约(Contract)名称。像这样的东西:
[DataContract(Name = "Data")]
public class Data<TKey> { ... }

发生上述错误,直到我从属性中删除了 Name属性值。希望也能帮助别人。我不知道在这种情况下哪种格式有效。这些没有:
[DataContract(Name = "Data\`1")]
[DataContract(Name = "Data{TKey}")]

有人知道怎么做吗?

编辑2

再次感谢@baretta,他指出实际上是正确的语法:
[DataContract(Name = "Data{0}")]

最佳答案

如果字符串遵循以下模式,则可以从字符串实例化泛型类型:
类名后跟一个“`”字符,后跟类型参数的数量(在本例中为1),后跟“[]”中包含的类型参数,并使用逗号作为类型参数分隔符。

<configuration>
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="Wrapper, TheirAssembly">
<!-- this syntax is all good -->
<knownType type="Data`1[System.Int32], MyAssembly"/>
<knownType type="Data`1[System.Int64], MyAssembly"/>
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
</configuration>

编辑:我可能还会补充,如果需要为类型参数指定汇编信息(尽管mscorlib中的内容不是这种情况),则使用嵌套的[[]]。
<knownType type="Data`1[[System.Int32, mscorlib]], MyAssembly"/>

编辑:您可以使用字符串格式模式来自定义数据协定中通用类型的名称。
[DataContract(Name = "Data{0}")]
public class Data<TKey>
{...}

默认情况下,为Data 类型生成的名称类似于“DataOfInt32HJ67AK7Y”,其中“HJ67AK7Y”
是从字符串“urn:default”或类的 namespace (如果有)生成的哈希。但是“Data {0}”将为其命名为“DataInt32”。

更多 here。查看页面下方的“自定义通用类型的数据契约(Contract)名称”部分。

关于.net - 如何在通用配置中指定WCF已知类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/976811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com