Ésta es "una especie de" posible. Algo así como que puedes hacerlo, pero es un poco complicado.
usted tiene 3 opciones:
Si conoces a sus clases en la delantera, utilizar una sentencia switch. Básicamente así:
switch(str){
case "TypeRepository": return new Repository<TypeRepository>;
}
Como una forma más avanzada de lo anterior, se puede usar un diccionario en lugar de una tabla hash
var factory = new Dictionary<string, Func<object>>();
factory.Add("TypeRepository",() => new Repository<TypeRepository>());
var theObject = factory["TypeRepository"]() as Repository<TypeRepository>;
Para mayor flexibilidad, puede utilizar la reflexión para que coincida con cadenas a clases en tiempo de ejecución. Tenga en cuenta que la reflexión es bastante lenta, por lo que si está haciendo esto con cualquier tipo de regularidad, quiere evitarlo. Como ejemplo, Aquí está uno que usa el método Frans Bouma's. Sólo cambia List<>
a Repository<>
en el código:
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>;
Nota: No hay forma de evitar el hecho de que todos estos mecanismos de retorno object
, que luego tiene que enviar contenido al tipo adecuado, en lugar de volver acaban de volver fuertemente tipado valores.
Esto es inevitable, porque no conoce el tipo de la lista hasta el tiempo de ejecución, y C# se basa en saber cosas en tiempo de compilación (esto es lo que las personas quieren decir cuando dicen "lenguaje de programación tipado estáticamente"). Será menos doloroso en C# 4, donde podrá devolver dynamic
, lo que le ahorrará el lanzamiento.
Tenga en cuenta que no puede consultar el Repositorio en su programa, por lo que el tipo de _rep deberá ser 'object' o alguna interfaz común a todos los Repository 's. –