我正在尝试向包含以下内容的代码添加一些DI:
Expression.New(newType)
我目前有一个IDependencyResolver dependencyResolver
,如果设置了服务,它可以解析或返回null。
我想知道是否有什么方法可以得到基本上与dependencyResolver.Resolve<NewType>() ?? new NewType()
等效的表达式
我已经尝试过类似的东西:
expr = expr !=null ? expr : Expression.New(typeof(NewType))
但是显然它不能很好地工作,因为表达式永远不会为空。
谢谢。
答案 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());