2009-08-17 70 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

相關問題