2011-09-09 10 views
7

(Nota, il codice sotto riportato è solo un esempio, per favore non commentare il motivo per cui è necessario. Gradirei una risposta definitiva di SÌ o NO, come se fosse possibile allora come? Se no, va bene anche. la domanda è vaga fatemi sapere anche grazie)Come posso ottenere ObjectSet <T> da Entity-Framework in fase di esecuzione dove T è dinamico?

esempio, posso avere ObjectSet < T> qui di seguito:.!

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

il codice precedente funziona bene. Tuttavia, ho bisogno che la tabella delle entità sia dinamica, così posso passare da un tipo all'altro. Qualcosa come sotto.

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

Ma il codice sopra non verrà compilato.

[EDIT:] Quello che mi piacerebbe è qualcosa di simile, o qualcosa di simile:

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

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

risposta

4

Potete utilizzare l'esempio qui a 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

ho trovato qui la risposta , http://geekswithblogs.net/seanfao/archive/2009/12/03/136680.aspx. Questo è molto buono perché elimina l'avere più oggetti repository per ogni tabella mappata da EF, in particolare per operazioni banali come CRUD, che è esattamente quello che stavo cercando.

+1

Ecco perché questo era assolutamente OT: "Per favore non commentare sul perché questo è necessario". Se hai appena descritto il motivo per cui è necessario, potresti avere quella risposta immediatamente. Controlla anche questo: http://stackoverflow.com/questions/5625746/generic-repository-with-ef-4-1-what-is-the-point/5626884#5626884 Il repository generico è un pattern errato - è utile solo come una base per repository specifici: http://stackoverflow.com/questions/7110981/the-repository-itself-is-not-usually-tested Le domande correlate riguardano l'API di DbContext ma è la stessa cosa con l'API ObjectContext. –

+0

Questo è un ottimo collegamento. Grazie. – Ronald

6

Ho questo lavoro con la seguente tweak per i suggerimenti di cui sopra: [? Come utilizzare riflessione di chiamare il metodo generico]

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