2

私自身の質問に続いて、自分のメソッドに を渡して、同じサービスと同じメソッドを呼び出す必要があることに気付きました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.Func2[Permet.BackEnd.ETL.Domain.Models.CLLI,System.Collections.Generic.IList 1[Permet.BackEnd.ETL.Domain.Models.Grouping]]]' cannot be converted to type 'System.Linq.Expressions.Expression1[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 はオブジェクトではありませんか?

4

1 に答える 1