Das ist "Art" möglich. Irgendwie in dem du es kannst, aber es ist ein bisschen wie ein Hack.
Sie haben 3 Optionen:
Wenn Sie Ihre Klassen vorne wissen, eine switch-Anweisung verwenden. Im Grunde wie folgt aus:
switch(str){
case "TypeRepository": return new Repository<TypeRepository>;
}
Als erweiterte Form der oben genannten, können Sie ein Wörterbuch anstelle eines Hash-Tabelle
var factory = new Dictionary<string, Func<object>>();
factory.Add("TypeRepository",() => new Repository<TypeRepository>());
var theObject = factory["TypeRepository"]() as Repository<TypeRepository>;
Für die größte Flexibilität verwenden, können Sie verwenden Reflexion Strings Klassen entsprechen zur Laufzeit. Seien Sie sich bewusst, dass die Reflexion ziemlich langsam ist. Wenn Sie dies mit einer gewissen Regelmäßigkeit tun, möchten Sie es vermeiden. Als Beispiel, hier ist eine Frans Bouma's Methode. Ändern Sie einfach List<>
zu Repository<>
im Code:
public static object MakeList(string typeStr)
{
var nameSpace = "MyTestApplication" + ".";
var objType = Type.GetType(nameSpace + typeStr); // NAMESPACE IS REQUIRED
var listType = typeof(List<>).MakeGenericType(objType);
return Activator.CreateInstance(listType);
}
var listOfThings = MakeList("MyCoolObject") as List<MyCoolObject>;
Hinweis: Es gibt keine Möglichkeit, die Tatsache zu vermeiden, dass alle diese Mechanismen object
zurückkehren, die Sie dann zu Ihrem richtigen Typ haben zu werfen, anstatt nur Zurückkehren stark typisierte Zurückkehren Werte.
Dies ist unvermeidbar, weil Sie den Typ der Liste erst zur Laufzeit kennen und C# darauf baut, Dinge zur Kompilierzeit zu kennen (das meinen die Leute, wenn sie "statisch typisierte Programmiersprache" sagen). Es wird weniger schmerzhaft in C# 4 sein, wo du dynamic
zurückgeben kannst, was dir das Casting erspart.
Beachten Sie, dass Sie in Ihrem Programm nicht auf Repository verweisen können, so dass der Typ von _rep "Objekt" oder eine gemeinsame Schnittstelle für alle Repository sein muss. –