gpt4 book ai didi

c# - 通用的 BehaviorExtensionElement 可能吗?

转载 作者:太空狗 更新时间:2023-10-29 21:55:45 24 4
gpt4 key购买 nike

我有一些 WCF 服务的服务行为,我只想注册;没有配置。我想我可以通过使用泛型跳过每次创建 BehaviorExtensionElement 后代:

public class SimpleBehaviorExtensionElement<TBehavior> : BehaviorExtensionElement
where TBehavior: new()
{
protected override object CreateBehavior()
{
return new TBehavior();
}

public override Type BehaviorType
{
get { return typeof(TBehavior); }
}
}

在 Web.config 中:

<behaviorExtensions>
<add name="myBehavior2"
type="WcfService1.SimpleBehaviorExtensionElement`1[[WcfService1.MyBehavior,
WcfService1]], WcfService1"/>
</behaviorExtensions>

WcfService1.MyBehavior 存在,实现了 IServiceBehavior,并且已经过测试。

但是当我在配置文件的行为部分引用 时,我得到:

An error occurred creating the configuration section handler for system.serviceModel/behaviors: Extension element 'myBehavior2' cannot be added to this element. Verify that the extension is registered in the extension collection at system.serviceModel/extensions/behaviorExtensions. Parameter name: element

如果我创建一个非通用的 BehaviorExtensionElement 后代,一切正常,我可以这样做。但现在它让我烦恼。 ;)

最佳答案

不幸的是,这对于配置文件是不可能的,至少不是以可靠的方式。

原因是如果你有一个泛型类class A<T>和一个类参数 class B框架不会创建类 A<B>直到你声明一个类型 A<B>通过使用它。格式为 A`1[[B, Assm]] 的名称只是在运行时创建的名称 - 它意味着通用“A”采用使用以下类型创建的 1 个参数。它不是类型工厂的提示 - 这是您正在做的事情所需要的。所以你可能能够让这个工作如果你很幸运并且A<B>碰巧已经宣布了,但我不会依赖它。

我相信,这是固定在框架后面部分使用的数据契约序列化中的,但是配置是旧的。如果您查看 XAML,则可以使用具有以下类型的类型参数:

<scg3:Dictionary x:TypeArguments="x:String, x:Object">

请注意,这是对类型工厂的显式指令 - 配置解析器没有的东西。

遗憾的是,这让您需要为每个扩展声明一个具体的类型——但这并不是很多工作:

public class MyBehaviorExtensionElement : 
SimpleBehaviorExtensionElement<MyBehavior> {}

从好的方面来说,它使您的配置文件更具可读性。

<behaviorExtensions>
<add name="myBehavior"
type="BehaviorTest.MyBehaviorExtensionElement, ServiceLibrary"/>
</behaviorExtensions>

关于c# - 通用的 BehaviorExtensionElement 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4753559/

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