0

私が達成しようとしているのは、親エンティティで add-method を使用して、そのエンティティ タイプのすべての子を追加する一般的な方法です。これは、エンティティ フレームワークがデータベース キーを使用して "魔法" を実行できるように、エンティティ オブジェクトを "チェーン" するために実行する必要があります (それらはすべて ID 列です)。

これは、私が今日使用する種類のコードです。

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

プログラムに文字列として「Application」と「MessageList」があります。したがって、次の 2 つのことを行いたいと考えています。

  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 に答える