2015-09-03 1 views
-1

Je veux changer ma classe entité avec le type d'objetComment définir le type dynamique <T> Par type d'objet?

MyEntity=x.GetType(); 

ObjectContext objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
ObjectSet<MyEntity> set = objectContext.CreateObjectSet<MyEntity>(); 
IEnumerable<string> keyNames = set.EntitySet.ElementType 
              .KeyMembers 
              .Select(k => k.Name); 

changement

ObjectContext objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
ObjectSet<x.GetType()> set = objectContext.CreateObjectSet<x.GetType()>(); 
IEnumerable<string> keyNames = set.EntitySet.ElementType 
              .KeyMembers 
              .Select(k => k.Name); 
+0

Quelle est votre question? –

+0

Je veux changer TEntity To My Object Type –

+0

Vous ne pouvez pas définir un paramètre de type générique à l'exécution, c'est une chose de compilation. Vous pouvez construire un type générique à l'exécution en utilisant la réflexion, mais c'est fiddly. –

Répondre

2

En utilisant Reflection vous pouvez appeler la méthode CreateObjectSet par le type de x exécution. Ensuite, vous pouvez extraire les noms de clés. Voici une méthode d'extension pour ce faire:

public static class ObjectContextExtensions 
{ 
    public static EntitySet GetEntitySet(this ObjectContext objectContext, object x) 
    { 
     //Get the approperiate overload of CreateObjectSet method 
     var methodInfo = typeof(ObjectContext).GetMethods() 
         .Where(m => m.Name == "CreateObjectSet").First(); 

     //Supply the generic type of the method 
     var genericMethodInfo = methodInfo.MakeGenericMethod(x.GetType()); 

     //Invoke the method and get the ObjectSet<?> as an object   
     var set = genericMethodInfo.Invoke(objectContext, new object[] { }); 

     //Retrieve EntitySet of the set 
     var prop = set.GetType().GetProperty("EntitySet"); 
     var entitySet = (EntitySet)prop.GetValue(set); 
     return entitySet; 
    } 
} 

maintenant, vous pouvez mettre à jour votre code comme:

ObjectContext objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
var set = objectContext.GetEntitySet(x); 
var keyNames = set.ElementType.KeyMembers.Select(k => k.Name);