有没有一种方法可以在Expression.New()中使用DI

时间:2019-02-05 23:06:54

标签: c# dependency-injection expression

我正在尝试向包含以下内容的代码添加一些DI: Expression.New(newType)

我目前有一个IDependencyResolver dependencyResolver,如果设置了服务,它可以解析或返回null。

我想知道是否有什么方法可以得到基本上与dependencyResolver.Resolve<NewType>() ?? new NewType()等效的表达式

我已经尝试过类似的东西:

expr = expr !=null ? expr : Expression.New(typeof(NewType))

但是显然它不能很好地工作,因为表达式永远不会为空。

谢谢。

1 个答案:

答案 0 :(得分:0)

Expression.New的方法重载,它接受Expression的params数组,该数组描述了该类型的构造函数参数。通过为每个参数提供正确的Expression对象,您将能够创建正确的表达式树,该树能够使用重载的构造函数创建类型。

例如:

var resolverExpr = Expression.Constant(resolver, typeof(IDependencyResolver));
var getServiceMethod = typeof(IDependencyResolver).GetMethod("GetService");

var constructor = typeof(NewType).GetConstructors()[0];

var constructorArguments =
    from p in constructor.GetParameters()
    select Expression.Call(
        instance: resolverExpr,
        method: getServiceMethod,
        arguments: new[] { Expression.Constant(p.ParameterType, typeof(Type)) });

var newExpr = Expression.New(constructor, constructorArguments.ToArray());