2013-08-25 1 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(); 
    } 
Смежные вопросы