2009-08-17 96 views
0

我在昨天发布的问题上取得了一些进展,因此我正在重写该帖子。由于组件中缺少类型导致的例外(修订)

我的问题似乎与我使用泛型有关。下面是App.config中的相关部分(带有空格的可读性格式):

<configSections> 
    <section 
     name="NA5300ResolverSynchroDevices" 
     type="InfrastructureModule.DeviceConfiguration.DeviceConfigurationSection 
      &lt;NA5300ResolverSynchroModule.NA5300ResolverSynchroConfigurationElement&gt;, 
      NA5300ResolverSynchroModule"> 
    </section> 
</configSections> 

<NA5300ResolverSynchroDevices> 
    <Device deviceName="AzResolverSynchro" busAddress="7"/> 
    <Device deviceName="ElResolverSynchro" busAddress="8"/> 
</NA5300ResolverSynchroDevices> 

以下是我正在试图映射到配置节的类:

namespace InfrastructureModule.DeviceConfiguration 
{ 
    public class DeviceConfigurationSection<T> : ConfigurationSection 
      where T : DeviceConfigurationElement, new() 
    { 
     [ConfigurationProperty("", IsDefaultCollection = true, IsKey = false)] 
     public DeviceConfigurationElementCollection<T> Devices 
     { 
      get { return (DeviceConfigurationElementCollection<T>) base[""]; } 
      set { base[""] = value; } 
     } 
    } 
} 

下面是尝试的C#代码访问配置文件:

DeviceConfigurationSection<NA5300ResolverSynchroConfigurationElement> devices = 
    ConfigurationManager.GetSection("NA5300ResolverSynchroDevices") as 
    DeviceConfigurationSection<NA5300ResolverSynchroConfigurationElement>; 

这里的异常文本我越来越:

出错创建NA5300ResolverSynchroDevices配置节处理程序:无法从程序集“NA5300ResolverSynchroModule”加载类型“InfrastructureModule.DeviceConfiguration.DeviceConfigurationSection <NA5300ResolverSynchroModule.NA5300ResolverSynchroConfigurationElement>”。

我知道,在C#泛型是在运行时,而不是在编译时(不像C++)实例化。我还不太了解泛型,以了解当泛型类型和实例化类型存在于不同的程序集中时,运行时生成的类型被认为存在于哪个程序集中。上面,我告诉运行时在汇编NA5300ResolverSynchroModule中查找它。我也试着告诉它在AssemblyModule程序集中寻找它。两者都不起作用。

我正在尝试使用genric类型,因为我将有许多配置部分的相应ConfigurationSection派生类型都将具有上面显示的形式。我想避免代码重复。

任何人都可以看到为什么我的方法失败,我该如何解决它?

+0

这是由于它的创建配置处理的方式。配置部分是什么样的? – 2009-08-17 23:53:08

+0

如果类型不在程序集中,则会导致此异常。 .NET不是在发明这个,或是对你说谎。它确实需要这种类型,它确实不在该组件中。你需要调查以了解这可能是真实的。 – 2009-08-17 23:56:11

+0

<设备设备名称= “AzResolverSynchro” busAddress = “7”/> <设备设备名称= “ElResolverSynchro” busAddress = “8”/> Dave 2009-08-18 17:41:54

回答

1

你的问题实际上是你如何引用泛型类型。

代替(缩短):

<section name="..." 
type="InfrastructureModule.DeviceConfiguration.DeviceConfigurationSection 
      &lt;NA5300ResolverSynchroModule.NA5300ResolverSynchroConfigurationElement&gt;, 
      NA5300ResolverSynchroModule" /> 

尝试

<section name="..." 
type="InfrastructureModule.DeviceConfiguration.DeviceConfigurationSection`1[[NA5300ResolverSynchroModule.NA5300ResolverSynchroConfigurationElement, NA5300ResolverSynchroModule]], 
      NA5300ResolverSynchroModule" /> 

注意`1 [[...]]而非<...>& lt; ... & gt;部分为泛型类型。 [[...中的部分]]也可以是一个完整的类型定义,比如namespace.class,assembly,token。

1 is "generic type with one type parameter". If the type takes 2 "aka SomeType<T,V>", use 2.请注意,你应该把“类型,装配”在双方括号,而不仅仅是“类型”

+0

那么,事实证明我还没有到达那里。我尝试了一个向前打勾(')和一个向后打勾('),并且我为组件试了两个InfrastructureModule和NA5300ResolverSynchroModule。这是四种组合,并且全部导致异常,仍然指示在我指定的组件中找不到所需的类型。我认为这是非常接近的。是否需要对您的建议进行一些句法调整? – Dave 2009-08-18 23:14:39

+0

对于记录来说,它是反向的,1,双方括号:'1 [[ - 同一个程序集中的两种类型? – 2009-08-19 02:49:41

+0

我已经编辑了一些信息。 – 2009-08-19 02:50:54

0

我相信我的问题是根源于我尝试映射到配置节的运行时生成类型不在组件中。所以,我创建了一个类型,确实生活在一个assmebly。

namespace NA5300ResolverSynchroModule 
{ 
    public class NA5300ResolverSynchroDeviceConfigurationSection : 
      DeviceConfigurationSection<NA5300ResolverSynchroConfigurationElement> 
    { 
    } 
} 

我可以在App.config中引用NA5300ResolverSynchroDeviceConfigurationSection。

+0

它不是泛型类型的位置,它实际上是app.config中的语法。 – 2009-08-18 21:20:59

相关问题