Есть ли способ использовать DI внутри Expression.New () - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь добавить DI к коду, который содержит: Expression.New(newType)

В настоящее время у меня есть IDependencyResolver dependencyResolver, который разрешает или возвращает ноль, если служба установлена.

Iхотел бы знать, есть ли способ получить выражение, которое будет в основном эквивалентно dependencyResolver.Resolve<NewType>() ?? new NewType()

Я уже пробовал что-то вроде:

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

Но, очевидно, это не такработать хорошо, потому что выражение никогда не равно нулю.

Заранее спасибо.

1 Ответ

0 голосов
/ 06 февраля 2019

Существует перегрузка метода Expression.New, которая принимает массив params Expression, который описывает аргументы конструктора типа.Предоставив правильные 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...