2011-09-09 8 views
7

(Tenga en cuenta que el siguiente código son solo ejemplos. No haga ningún comentario sobre por qué es necesario. Agradecería una respuesta definitiva de SÍ o NO, como si fuera posible, ¿cómo? Si no, también está bien. la pregunta es vaga, hágamelo saber Gracias también)¿Cómo puedo obtener ObjectSet <T> de Entity-Framework en tiempo de ejecución donde T es dinámico?

ejemplo, puedo conseguir ObjectSet < T> a continuación:.!

ObjectSet<Users> userSet = dbContext.CreateObjectSet<Users>(); 
ObjectSet<Categories> categorySet = dbContext.CreateObjectSet<Categories>(); 

el código anterior funciona bien. Sin embargo, necesito que la tabla de entidades sea dinámica para poder cambiar entre tipos. Algo como abajo.

//var type = typeof(Users); 
var type = typeof(Categories); 
Object<type> objectSet = dbContext.CreateObjectSet<type>(); 

Pero el código anterior no se compilará.

[EDIT:] Lo que me gustaría es algo así, o algo similar:

//string tableName = "Users"; 
string tableName = "Categories"; 
ObjectSet objectSet = dbContext.GetObjectSetByTableName(tablename); 
+0

posible duplicado de (http://stackoverflow.com/questions/ 232535 ​​/ how-to-use-reflection-to-call-generic-method) – nawfal

Respuesta

4

¿Se puede utilizar el ejemplo aquí en How do I use reflection to call a generic method?

var type = typeof(Categories); // or Type.GetType("Categories") if you have a string 
var method = dbContext.GetType.GetMethod("CreateObjectSet"); 
var generic = method.MakeGenericMethod(type); 
generic.Invoke(dbContext, null); 
0

he encontrado la respuesta aquí , http://geekswithblogs.net/seanfao/archive/2009/12/03/136680.aspx. Esto es muy bueno porque elimina tener múltiples objetos de repositorio para cada tabla mapeada por EF particularmente para operaciones mundanas como CRUD, que es exactamente lo que estaba buscando.

+1

Es por eso que esto fue absolutamente OT: "Por favor, no comenten por qué esto es necesario". Si acaba de describir por qué es necesario, podría tener esa respuesta de inmediato. También verifique esto: http://stackoverflow.com/questions/5625746/generic-repository-with-ef-4-1-what-is-the-point/5626884#5626884 El repositorio genérico es un patrón incorrecto, es útil solo como una base para el repositorio específico: http://stackoverflow.com/questions/7110981/the-repository-itself-is-not-usually-tested Las preguntas relacionadas son acerca de la API DbContext, pero es lo mismo con ObjectContext API. –

+0

Ese es un enlace muy bueno. Gracias. – Ronald

6

Tengo este trabajo con el siguiente truco a las sugerencias anteriores: [? ¿Cómo utilizar la reflexión para llamar al método genérico]

var type = Type.GetType(myTypeName); 
var method = _ctx.GetType().GetMethod("CreateObjectSet", Type.EmptyTypes); 
var generic = method.MakeGenericMethod(type); 
dynamic objectSet = generic.Invoke(_ctx, null); 
Cuestiones relacionadas