2011-10-13 86 views
1

我在創建實體對象時遇到問題。我不知道對象類型,但我有要創建的實體的名稱和主鍵的名稱。該功能顯示了問題:.NET中實體的一般創建EF4

 /// <summary> 
    /// create a new entity and save it o object context 
    /// </summary> 
    /// <param name="oc"></param> 
    /// <param name="entityName">type name of new entity</param> 
    /// <param name="pkName">primary key name of new entity</param> 
    /// <returns></returns> 
    Guid genericCreate(ObjectContext oc, String entityName, String pkName) 
    { 
     // create a new primary key 
     Guid newPk = Guid.NewGuid(); 

     // create new entity key 
     EntityKey entityKey = new EntityKey(oc.GetType().Name + "." + entityName, pkName, newPk); 

     // get type name of new entity 
     String typeName = oc.GetType().Namespace + "." + entityKey.EntitySetName; 

     // create a new entity 


     // this dont work :/ 
     // Error: Operator '<' cannot be applied to operands of type 'method group' and 'System.Type' 
     var entity = oc.CreateObject<System.Type.GetType(typeName)>(); 

     // this works, but we run in problems at another place 
     // var anotherEntity = Activator.CreateInstance(System.Type.GetType(typeName)); 


     // assign entity key 
     IEntityWithKey entityWithKey = (IEntityWithKey)entity; 
     entityWithKey.EntityKey = entityKey; 

     // add entity to object context 
     String entitySetName = getEntitySetName(entityName); 
     oc.AddObject(entitySetName, entityWithKey); 

     // write to database 
     oc.SaveChanges(); 

     return newPk; 
    } 
+0

它不會這樣工作,因爲泛型參數不是'System.Type's,而是編譯時已知的類型。 'GetType()'在運行時返回類型名稱。 Eranga的回答是正確的,因爲你必須使用反射來獲取動態方法句柄。 – Andreas

+0

可能的重複[如何使用反射來調用泛型方法?](http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-generic-method) – nawfal

回答

1

您可以使用反射來進行調用CreateObject方法描述here

Guid genericCreate(ObjectContext oc, String entityName, String pkName) 
{ 
    // create a new primary key 
    Guid newPk = Guid.NewGuid(); 

    // create new entity key 
    EntityKey entityKey = new EntityKey(oc.GetType().Name + "." + entityName, pkName, newPk); 

    // get type name of new entity 
    String typeName = oc.GetType().Namespace + "." + entityKey.EntitySetName; 

    // create a new entity 

    var method = oc.GetType().GetMethod("CreateObject"); 
    method = method.MakeGenericMethod(System.Type.GetType(typeName)); 
    var entity = method.Invoke(service, null); 


    // assign entity key 
    IEntityWithKey entityWithKey = (IEntityWithKey)entity; 
    entityWithKey.EntityKey = entityKey; 

    // add entity to object context 
    String entitySetName = getEntitySetName(entityName); 
    oc.AddObject(entitySetName, entityWithKey); 

    // write to database 
    oc.SaveChanges(); 

    return newPk; 
} 
+0

非常感謝你。 ..它的工作;) – coyote76

+0

@ coyote76 :)你可以標記這是接受的答案。 – Eranga