2012-10-17 65 views
5

鑑於,我有一種「Wibble.Wobble」存在於組裝「Foo.Bar」現有的類/方法

該組件沒有裝入主要應用負載情況下

是否有解析以下字符串的後續部分現有的公共機制:

"Wibble.Wobble, Foo.Bar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xyz" 

之所以要求是,我需要在運行時加載各種類型,其中一些可能處於當前加載上下文中。其他人可能需要從外部裝配中加載。

我知道如何從當前加載上下文加載類型Type.GetType("typename"),我知道如何加載程序集並從中獲取類型Assembly.LoadFile("xyz").GetType("abc")。我遇到的問題是,如果您嘗試從程序集中加載某個類型,則它不應該是完全限定名稱,您可以像使用Type.GetType時那樣。

解決方案本身不應該那麼複雜,它只是在第一個逗號前分割字符串。不過,我想知道是否有一種方法可以將完全限定名稱作爲對象表示形式,所以我不必這樣做,這將有助於查找正確的程序集,而無需遍歷整個目錄。

回答

1

畢竟,我不認爲框架中有任何公開的東西可以做到這一點。我希望有人向我展示不同的東西,因爲我更喜歡使用(或應該)更好地測試和編寫的核心功能,這些人比我更瞭解框架。

因此,我推出了自己的強類型TypeName對象。

class TypeName 
{ 
    public TypeName(string name) 
    { 
     var index = name.LastIndexOf(','); 
     if (index > 0) 
     { 
      Name = name.Substring(0, index).Trim(); 

      AssemblyName = new AssemblyName(name.Substring(index + 1).Trim()); 
     } 
     else 
     { 
      Name = name;  
     } 
    } 

    public string Name { get; private set; } 

    public AssemblyName AssemblyName { get; private set; } 
} 

對象獲取一個string其應該是一個類型名稱或完全限定的類型名稱。如果它是完全限定類型的名稱,那麼使用AssemblyName類設置AssemblyName屬性,否則將其保留爲空。

+1

indexof爲您提供了逗號的第一個匹配項,它可以用作泛型參數中的分隔符。這不會很漂亮 –

+0

@DavidSchmitt公平點,我還沒有處理這種情況,但我已經更新了示例使用LastIndexOf而不是IndexOf。謝謝你的提示。 – Bronumski

+1

隨着LastIndexOf,它可能只是永遠不會工作,考慮 System.String,mscorlib,版本= 4.0.0.0,文化=中性,PublicKeyToken = b77a5c561934e089 最後一個索引只會得到PublicKeyToken部分 – Alex