2011-08-25 72 views
0

我想基於將從用戶界面中檢索到的字符串使一個類的實例,然後我想要訪問該類的實例的屬性。從給定接口的字符串的C#實例化類

這裏是我到目前爲止的概述 -

namespace MamdaAdapter 
{ 
    public interface IExchange 
    { 
     string GetTransport(); 
    } 
} 


namespace MamdaAdapter 
{ 
    public class Exchange 
    { 
     public class Arca : IExchange 
     { 
      private const string _Transport = "tportname"; 

      public string GetTransport() 
      { 
       return _Transport; 
      } 
     } 


     public static IExchange DeriveExchange(string ExchangeName) 
     { 
      IExchange SelectedExchange = (IExchange)Activator.CreateInstance(Type.GetType(ExchangeName)); 

      return SelectedExchange; 
     } 
    } 
} 



namespace MyUserInterface 
{ 
    public class MainForm 
    { 
     private void simpleButton1_Click(object sender, EventArgs e) 
     { 
      IExchange SelectedExchange = Exchange.DeriveExchange("Exchange.Arca"); 

      Console.WriteLine(SelectedExchange.GetTransport()); 
     } 
    } 
} 

UPDATE: 現在,我收到寫着「值不能爲空」這對我來說意味着異常它是無法創建給出提供的字符串的類的實例 -

+0

什麼不行?你有錯誤嗎? – driis

+0

你現在遇到的問題是什麼? – Daniel

+0

還有一些需要考慮的問題是,有一些IoC庫的套件可以用於生活 - 看NInject,Unity或其他 - 它們可以是配置驅動,程序驅動等。 – stephbu

回答

1

的問題,在這裏你是如何指定類的名稱:

首先,指定命名空間。其次,由於Arca是一個內部類,你必須使用'+'而不是''。

(...) = Exchange.DeriveExchange("MamdaAdapter.Exchange+Arca"); 
1

假設你UI犯規露出完整的類型名稱,你通常需要一個字典顯示名稱關聯至類型:

Dictionary<string, Type> _associations = new Dictionary<string, Type>(); 

然後,只需要簡單的新對象:

if(_associations.ContainsKey(someString)) 
{ 
    Type selectedType = _associations[someString]; 

    return Activator.CreateInstance(selectedType) as IExchange; 
} 

throw new ApplicationException("No type defined for that string yo"); 

如果字符串不是在編譯時已知,你基本上需要檢查的類型是否存在等:

var type = Type.GetType(someString); 

if(type != null) 
{ 
    // Do Stuff 
} 
0

我寫了一個小C#控制檯應用程序來模擬你的需要,測試OK,希望它有助於:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using MamdaAdapter; 
using System.Reflection; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      IExchange SelectedExchange = Exchange.DeriveExchange("MamdaAdapter.Arca"); 
      Console.WriteLine(SelectedExchange.GetTransport()); 
     } 
    } 
} 

namespace MamdaAdapter 
{ 
    public interface IExchange 
    { 
     string GetTransport(); 
    } 
} 


namespace MamdaAdapter 
{ 
    public class Arca : IExchange 
    { 
     private const string _Transport = "tportname"; 

     public string GetTransport() 
     { 
      return _Transport; 
     } 
    } 
} 

namespace MamdaAdapter 
{ 
    public class Exchange 
    { 
     public static IExchange DeriveExchange(string ExchangeName) 
     { 
      IExchange SelectedExchange = (IExchange)Assembly.GetAssembly(typeof(IExchange)).CreateInstance(ExchangeName, false, BindingFlags.CreateInstance, null, null, null, null); 
      return SelectedExchange; 
     } 
    } 

} 
0

如果您正在尋找的類型沒有在執行Type.GetType的相同程序集中定義,您必須使用AssemblyQualifiedName(類似MyNamespace.MyClass,MyAssembly,Version = 1.3.0.0,Culture = neutral,PublicKeyToken = b17a5c561934e089),甚至FullName是不足夠的。否則,您可以先獲取包含該類的程序集,然後執行Assembly類的GetType方法。