Per poter leggere i file da un altro progetto, sto copiando il codice di scrittura e adattandolo alle mie esigenze.
Sono giunto a un costrutto curioso che sembra davvero brutto, ma non so se c'è un altro modo per affrontarlo.
Il codice ha un aspetto simile al seguente:
int type = reader.readInt32():
BaseClass p = BaseClass.Instantiate((BaseClassEnum)type);
object.Read(reader);
Questo codice sembra carino, e lo è, ma il metodo BaseClass.Instantiate (tipo BaseClassEnum) lascia qualcosa a desiderare.
Fondamentalmente, si tratta di un'affermazione di caso switch gigante che crea un'istanza di una sottoclasse della classe di base in base al parametro di tipo passato.
C'è un modo per evitare l'interruttore qui? Posso creare un dizionario in cui mappare BaseClassEnum a qualche tipo di riferimento di classe che mi consenta di chiamarlo come costruttore? Qualcosa come:
Dictionary<int, ???> bindings = new Dictionary<int, ???>(){
{BaseClassEnum1, SubClass1},
{BaseClassEnum2, SubClass2}
}
//...
//Assuming SubClass1 has a constructor SubClass1()
BaseClass p = new bindings[BaseClassEnum1]();
//I could even create a new constructor SubClass(BinaryReader reader) and do
BaseCoass p = new bindings[BaseClassEnum1](reader);
Alla fine, il codice sarebbe simile a questo:
BaseClass p = new bindings[(BaseClassEnum)reader.ReadInt32()](reader);