2013-08-25 27 views
0

考慮下面的代碼:如何從參數數組中實例化一個特定的子類型?

public abstract class BaseClass { 
    abstract void DoWork(); 
    virtual void MoreWork() { 
     Console.WriteLine("MoreWork"); 
    } 
} 
public class classA : BaseClass { 
    public void DoWork() { DoStuffA(); } 
} 
public class classB : BaseClass { 
    public void DoWork() { DoStuffB(); } 
} 

我想有一個方法,我想通過所有這些類型的,並讓他們進行實例化到。

void Initialize(params BaseClass[] lst) { 
    for (int i = 0; i < objectList.Length; i++) { 
     Activator.CreateInstance(objectList[i]); // not sure if this works. 
    } 
} 

Initialize(classA, classB); 

我該如何解決這個問題?

+0

不能使用'classA'和'classB'作爲值;他們是類型。您可以使用'Initialize ();'作爲泛型方法,但不能爲類型參數創建類似於「'params'」的東西。或者你可以使用'Initialize(typeof(classA),typeof(classB));'在答案中。除此之外,代碼中的很多事情都不會編譯,例如虛擬方法(包括抽象方法)不能是私有的,它們的覆蓋必須聲明相同的訪問級別並使用「override」關鍵字。 –

回答

2

您不應該將對象實例發送給初始化方法,而是它們的類型。

void Initialize(params Type[] lst) { 
    foreach(Type type in lst) { 
     Activator.CreateInstance(type); 
    } 
} 

Initialize(typeof(classA), typeof(classB)); 

下面是一個完整的例子:

public Form1() 
    { 
     InitializeComponent(); 

     Initialize(typeof(ClassA), typeof(ClassB)); 
    } 

    public class BaseClass { } 

    public class ClassA : BaseClass { } 

    public class ClassB : BaseClass { } 

    public BaseClass[] Initialize(params Type[] lst) 
    { 
     // if we already know the item count, why not set the capacity of the list. 
     List<BaseClass> instances = new List<BaseClass>(lst.Length); 

     foreach (Type type in lst) 
      if (type.IsSubclassOf(typeof(BaseClass))) 
       instances.Add((BaseClass)Activator.CreateInstance(type)); 

     return instances.ToArray(); 
    } 
相關問題