0

我想要实现的是在父实体上使用 add-method 来添加该实体类型的所有子实体的通用方法。必须这样做以将实体对象“链接”在一起,以便实体框架可以使用数据库键(它们都是身份列)来发挥其“魔力”。

这是我今天使用的那种代码:

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

我的程序中有“Application”和“MessageList”作为字符串。因此,我想做两件事:

  1. 将 GetType 与字符串一起使用,以便可以动态转换 ParentEntityObject 和 ChildEntityObject。
  2. 使用某种反射魔法来获取“MessageLists.Add”函数。再次; 假设我将“MessageLists”作为字符串。

我不确定如何做到这一点。任何意见是极大的赞赏!

4

1 回答 1

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
于 2012-08-10T08:32:47.320 回答