私自身の質問に続いて、自分のメソッドに を渡して、同じサービスと同じメソッドを呼び出す必要があることに気付きましたExpression<Func<T, object>>
。メソッド定義は次のとおりです。
IList<T> List(params Expression<Func<T, object>>[] includeProperties);
これが私が今持っているコードです:
//Get generic type
var entityRelationType = typeof(Applicant).Assembly.GetType(string.Format("Permet.BackEnd.ETL.Domain.Models.{0}", tableRelation.RelationEntityName));
//create service that will receive the generic type
var definitionIService = typeof(IService<>).MakeGenericType(entityRelationType);
//instantiate the service using Unity (todo: fix singleton)
var serviceInstance = UnitySingleton.Container.Resolve(definitionIService, "");
//create the argument for the method that we invoke
var paramsType =
typeof(Expression<>).MakeGenericType(typeof(Func<,>)
.MakeGenericType(entityRelationType, typeof(object))).MakeArrayType();
#region Get Dynamic Data
ParameterExpression relationParameter = Expression.Parameter(entityRelationType, "");
//build the parameter that we want to pass to the method (Expression<Func<T, object>>
var include =
Expression.Lambda(
Expression.Property(relationParameter, tableRelation.NaviguationProprietyName),
relationParameter
);
dynamic datas = constructedIService
.GetMethod("List", new Type[] { paramsType }).Invoke(serviceInstance, new object[] { include });
インクルードは、私のラムダ式 (Param_0 => Param_0.Groupings) を正常に作成しますExpression<Func<T, object>>
。ただし、Param_0.Groupings は実際には IList であるため、例外が発生します。
タイプ 'System.Linq.Expressions.Expression
1[System.Func
2[Permet.BackEnd.ETL.Domain.Models.CLLI,System.Collections.Generic.IList1[Permet.BackEnd.ETL.Domain.Models.Grouping]]]' cannot be converted to type 'System.Linq.Expressions.Expression
1[System.Func`2[Permet.BackEnd.ETL.Domain.Models. CLLI,System.Object]][]'.
これは基本的Expression<Func<CLLI, IList<Grouping>>>
に、 を期待するメソッドで my を使用できないことを意味しExpression<Func<CLLI, object>>
ます。
実際にサービスを直接呼び出した場合:
IService<CLLI> clliService = new Service<CLLI>();
clliService.List(clli => clli.Groupings);
できます。
この問題をどのように回避しますか? IList はオブジェクトではありませんか?