2012-08-09 23 views
0

我想要實現的是使用父實體上的add-method來添加該實體類型的所有子項的通用方法。這必須將實體對象「鏈接」在一起,以便實體框架可以通過數據庫鍵(它們都是標識列)來實現它的「魔力」。使用反射來添加實體

這是代碼,我今天使用的類型:

EntityObject ParentEntityObject; 
EntityObject ChildEntityObject; 
((Application)ParentEntityObject).MessageLists.Add((MessageList)ChildEntityObject); 

我有「應用程序」和「MessageList中的」在我的程序字符串。因此,我想做兩件事:

  1. 對字符串使用GetType,因此可以動態地轉換ParentEntityObject和ChildEntityObject。
  2. 使用某種反射魔法來獲取'MessageLists.Add'函數。再次;讓我們假設我有'MessageLists'作爲一個字符串。

我不確定如何做到這一點。任何意見是極大的讚賞!

回答

0

你可以嘗試表達樹做「魔術」的東西。 例如:

class BaseEntity 
{ 

} 
class MessageList : BaseEntity 
{ 

} 
class Application:BaseEntity 
{ 
    public List<BaseEntity> MessageLists { get; set; } 
    public Application() 
    { 
     MessageLists = new List<BaseEntity>(); 
    } 
} 
class ExpressionHelper 
{ 
    public static Action<object,object> GetMethod(string targetTypename,string targetMemberName,string sourceTypeName) 
    { 
     ParameterExpression targetExpression = Expression.Parameter(typeof(object)); 
     MemberExpression propertyExpression = Expression.PropertyOrField(Expression.TypeAs(targetExpression, Type.GetType(targetTypename)), targetMemberName); 
     ParameterExpression sourceExpression = Expression.Parameter(typeof(object)); 
     Expression callExpression = Expression.Call(propertyExpression, "Add", null, Expression.TypeAs(sourceExpression, Type.GetType(sourceTypeName))); 

     var lambda = Expression.Lambda<Action<object, object>>(callExpression, targetExpression, sourceExpression); 
     var method = lambda.Compile(); 
     return method; 
    } 
} 

用法:

var app = new Application(); 
    var messageList = new MessageList(); 
    var magicMethod = ExpressionHelper.GetMethod(/*type*/"Application",/*name of Property-Storage*/"MessageLists",/*type of element to store*/"MessageList"); 
    magicMethod(app, messageList); 
    //now app.MessageLists has one element 
+0

好極了,這工作完美。爲我節省了800行煩人的代碼! – MariWing 2012-08-17 08:52:40

+0

很高興幫助你! – 2012-08-17 10:02:54