2012-08-09 64 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