Могу ли я создать экземпляр производного класса на основе определенного свойства, определенного в моем абстрактном базовом классе? - PullRequest
0 голосов
/ 12 марта 2019

По сути, у меня есть абстрактный класс, скажем, два свойства, одно из которых абстрактное, а некоторые производные.

public abstract class BaseClass { 
    public string ID { get; set; } 
    public abstract string Name { get; };
}

public class Class1 : BaseClass { // id would be 1
    public string Name { get { return "Class1 Name"; }
}

public class Class2 : BaseClass {
    public string Name { get { return "Class2 Name"; }
}

public class Class3 : BaseClass {
    public string Name { get { return "Class3 Name"; }
}

Затем у меня есть метод в моем слое данных, который возвращает в основном список идентификаторов.для базового класса.Я спрашиваю, могу ли я создать новый экземпляр DerivedClass, основываясь на том, что эти идентификаторы без операторов if или switch?Итак ...

List<BaseClass> list = new List<BaseClass>();
string id = dataReader["ID"].ToString(); // say this id = 1
list.Add(new BaseClass { ID = id }); // this would be "Class1 Name" and the Class would be Class1

Я знаю, что не могу создать новый экземпляр абстрактного класса, поэтому «новый BaseClass ()» не работает, но это единственный способ, которым я знаю, как объяснитьЭто.Я пытался сделать копию или клонировать с помощью Reflection, но не уверен, что он действительно будет делать то, что я хочу.Это очень хорошо, возможно, было бы невозможно, но я решил спросить.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Как насчет:

switch(id) {
   case "1": list.Add(new Class1());
   break;
   ...
}

Вы также можете использовать:

list.Add((BaseClass)Activator.CreateInstance("AssemblyName", "Class"+id));

см. Также Как создать экземпляр класса с учетом его строкового имени?

0 голосов
/ 12 марта 2019

Создайте словарь, содержащий типы, связанные с их идентификаторами (значение которого будет указано в строковом свойстве, от которого вы будете зависеть):

Dictionary<string, Type> dictOfTypes = new Dictionary<string, Type>();
dictOfTypes.Add("1", typeof(Class1));

Затем, в зависимости от имеющегося у вас идентификатора, вы можете получить элемент из Dictionary, а затем создать экземпляр:

string id = "1";
Type classType = dictOfTypes[id];
var instance = Activator.CreateInstance(classType);
...