Мне интересно, могу ли я обновить базовый контейнер IoC, который я использую для поддержки ленивой загрузки. Поэтому, если я зарегистрировал IFoo, я бы хотел, чтобы контейнер IoC знал, как выполнять обе следующие зависимости (первый из них является стандартным способом работы контейнеров IoC, а второй возвращает простой делегат, который вызывает контейнер для IFoo, когда он вызывается).
public Bar(IFoo x)
public Bar2(Func<IFoo> lazyFoo)
Проблема возникает, когда я пытаюсь написать код, который на самом деле это сделает. Есть ли синтаксис, который сделает компиляцию следующего псевдокода?
public T Resolve<T>()
{
if (T is Func<X>)
return (T) () => Resolve(typeof(X));
return (T)Resolve(typeof(T));
}
Или задать свой вопрос другим способом, если у меня есть тип T
, как я могу определить, является ли это экземпляром Func<X>
, и если да, то каков тип X
?
Взгляните на этот вопрос с сегодняшнего утра - может дать вам хорошее начало - С# общий список <T> как получить тип T?
Я неправильно понял ваш вопрос.
Невозможно сделать это в одной функции так, как вы пытаетесь, потому что компилятор должен иметь тип делегата для создания лямбды во время компиляции.
Однако это должно работать.
public T Resolve<T>()
{
return (T)Resolve(typeof(T));
}
public Func<T> LazyResolve<T>()
{
return () => Resolve<T>();
}
В ответ на вопрос в комментарии вам нужно вызвать выражение лямбда, а не произносить его.
List
наFunc
и все готово ...