2014-04-09 124 views
0

我有81類(還在不斷增加),它實現一個接口,並且我有了這表示界面前一個屬性的類:避免反射

public wrapper 
{ 
    public Imyinterface instance{get;set;} 

    public wrapper(string theNameOfTheClass) 
    { 
    instance = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(theNameOfTheClass); 
    instance.Run(); //the interface has a run method 
    } 
} 

這是一起去的最佳途徑,我怎樣才能避免反思,而不必編寫任何額外的代碼?

+1

'wrapper'的目標是什麼?爲什麼我會在新的Imp12()'上面調用'new Wrapper(「Imp12」)。Instance'? – Kobi

+0

包裝具有在類之間共享的方法,它們產生相同的數據格式,並且包裝器在Run()方法完成後基本做一些處理。 – user1492051

+0

爲什麼不讓這些類實現一個通用接口? –

回答

1

看一看統一的IoC(或任何其他國際奧委會可以從字符串解析):

IOC Container Runtime Resolution

string typeName = "MyTypeName"; 
var type = container.Registrations.FirstOrDefault(r => r.RegisteredType.Name == typeName); 
if(type != null) 
{ 
    var resolvedInstance = container.Resolve(type.RegisteredType); 
} 

編輯:對於約定優於配置來看看在鏈接的鏈接這個問題

Using Unity With Minimal Configuration

+0

好的,但你必須在使用之前在某處註冊這些類,不是嗎? – Spook

+0

是的,但是您可以通過配置進行約定。例如。給它一個命名空間和/或程序集以查找,並且將從那裏註冊所有類。 –

+1

我知道,你要去哪裏,但是這個解決方案實際上只會將反射的使用委託給另一個類,不是嗎? :) – Spook

4

我不知道,但也許:

public Wrapper<T> 
    where T : IMyInterface, new() 
{ 
    public IMyInstance instance { get; set; } 

    public Wrapper() 
    { 
     instance = new T(); 
     instance.Run(); 
    } 
} 

這樣使用它:

Wrapper<SomeClass> wrapper = new Wrapper<SomeClass>(); 

如果你想保留包裝上的某種名單,只是得到他們共同的,非通用類:

public abstract class BaseWrapper 
{ 

} 

public class Wrapper<T> : BaseWrapper 
... 

編輯:迴應評論

也許問題不在包裝類中。如果你從用戶那裏得到一個字符串,你只有兩個選擇:一個巨大的開關或反射。

您可能會更改例如通過改變列表框的內容:

public class ComboBoxItem 
{ 
    public string Title { get; set; } 
    public Func<IMyInterface> creator { get; set; }   

    public override string ToString() 
    { 
     return Title; 
    } 
} 

現在創建這些項目的清單,並把它傳遞到ComboBox:

var items = new[] { 
    new ComboBoxItem { Title = "First class", creator =() => new FirstClass() }, 
    new ComboBoxItem { Title = "Second class", creator =() => new SecondClass() }, 
} 

你必須來填充組合框無論如何,所以是一些硬編碼。重點是隻在一個地方對類列表進行硬編碼(甚至可以在與ComboBox無關的地方,然後基於該列表重新創建ComboBox內容)。

+0

但問題是我不想硬編碼,因爲有太多的類,並且基於從列表框中選擇的值創建一個包裝實例,它會收集類名稱的字符串 – user1492051

+0

填充組合框不是由於數據的一個問題是在由一個金髮碧眼的祕書填補了一個SQL數據庫可用;) – user1492051

+1

如果你沒有在代碼匹配與類類型的字符串的方式,我想你是沒辦法了,你就必須以某種方式使用反射。 @MichalCiechan建議,你可以做得更好一些。 – Spook