Если я вас правильно понимаю, вы хотите, чтобы базовый класс определял, какой дочерний класс создать, основываясь на данных, переданных в конструктор. Если это так, вы не можете сделать это таким образом - класс не может изменить себя, чтобы быть другим / производным типом при создании.
Я предполагаю, что все типы данных имеют некоторые общие свойства, и поэтому вы решили положить эти общие свойства в базовом классе. Я также предполагаю, что вы не хотите, чтобы у каждого дочернего класса данных был избыточный код, устанавливающий эти общие свойства в базовом классе. Вы достигаете sh того, что дочерний класс вызывает метод в базовом классе, передавая данные. Вы можете сделать это в конструкторах, если вы будете sh. Например:
class BaseData
{
BaseData(Dictionary<string,string> data)
{
this.CommonProp1 = data["CommonProp1"];
this.CommonProp2 = data["CommonProp2"];
}
public string CommonProp1 { get; set; }
public string CommonProp2 { get; set; }
}
class DataTypeA : BaseData
{
DataTypeA(Dictionary<string,string> data)
: base(data) // <-- magic here
{
this.TypeA_Prop1 = data["TypeA_Prop1"];
this.TypeA_Prop2 = data["TypeA_Prop2"];
}
public string TypeA_Prop1 { get; set; }
public string TypeA_Prop2 { get; set; }
}
Я полагаю, что фабричный шаблон - это то, что вам нужно, поскольку вы хотите создать экземпляр класса, в котором тип определяется во время выполнения. Здесь вы инкапсулируете код, который определяет тип создаваемого дочернего класса. Что-то вроде:
class DataFactory
{
public static BaseData BuildDataClass(byte[] serializedData)
{
Dictionary<string,string> data = ParseData(serializedData);
switch (data["DataType"])
{
case "TypeA":
return new DataTypeA(data);
default:
return null;
}
}
private static Dictionary<string,string> ParseData(byte[] serializedData)
{
var data = new Dictionary<string, string>();
// bla bla
return data;
}
}