コンパイル時にわからないDbSetのAddメソッドで動的呼び出しを行いたいと思います。DbSetで動的にperformantメソッドを呼び出す
実際には、単純な反射でも可能ですが、パフォーマンスはひどいです。ここで使用しているコードは次のとおりです。
Type contextType = (context as Object).GetType();
var set = (contextType.GetProperty(entitySetName)).GetValue(context, null);
Type typeSet = set.GetType();
MethodInfo method = typeSet.GetMethod("Add");
Object[] args = { entity };
method.Invokke(set, args);
私はさまざまなエラーで2つの可能性を試しました。
最初の他、デリゲート
public delegate void MyDel<T>(T t,object entity);
Type contextType = (context as Object).GetType();
var set = (contextType.GetProperty(entitySetName)).GetValue(context, null);
Type typeSet = set.GetType();
MethodInfo method = typeSet.GetMethod("Add");
Type template = typeof(MyDel<>);
Type specific = template.MakeGenericType(childClassType);
Delegate test = Delegate.CreateDelegate(specific, method);
を使用することですが、最後の行に、私は次のエラーを取得する:エラーは、メソッド
をターゲットに結合し、第三の選択肢は次のように式ツリーを使用することです:
Type contextType = (context as Object).GetType();
var set = (contextType.GetProperty(entitySetName)).GetValue(context, null);
Type typeSet = set.GetType();
MethodInfo method = typeSet.GetMethod("Add");
ParameterExpression paramo = Expression.Parameter(typeSet, "param");
ParameterExpression parami = Expression.Parameter(typeSet, "newvalue");
Expression convertedParamo = Expression.Convert(paramo, typeof(Object));
Expression convertedParami = Expression.Convert(parami, typeof(Object));
MethodCallExpression methodCall = Expression.Call(convertedParamo, method, convertedParami);
Expression valueExp = Expression.Lambda(methodCall, paramo, parami);
Expression<Action<Object, Object>> dynamicExpression = (Expression<Action<Object, Object>>)valueExp;
Action<Object, Object> dynamicAction = dynamicExpression.Compile();
Object o = Activator.CreateInstance(otherType);
dynamicAction(o, entity);
しかし、この場合では、ライン「Expression.Call(convertedParamo、方法、で...
私はこのエラーを得た:
メソッド 'DictionnaireONYX.Entites.ArticleSansFacturier 追加(DictionnaireONYX.Entites.ArticleSansFacturier)' はSystem.Data.Entity.DbSet`1 [DictionnaireONYX.Entites.ArticleSansFacturier」タイプ で宣言] ' ' System.Object 'タイプのインスタンスで呼び出すことはできません
ここで、ArticleSansFacturierはDbSetです。
誰が私を助けることができますか?事前
これは、関連するさまざまな種類が何であるかは明らかではありません。 'typeSet'は実際にセットの型か要素の型ですか?あなたは両方の異なる点でそれを使用しているようです。どのようにこれを使用しようとしているのかの具体的な例を与えることができれば、そのタイプを見ることができます。 –
これは役に立ちますか?:https://github.com/maxbeaudoin/MagicDbModelBuilder – maxbeaudoin