Как определить, является ли тип Func <T> и получить тип T [duplicate]

2

Мне интересно, могу ли я обновить базовый контейнер 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?

Теги:
generics
ioc-container

3 ответа

3
Лучший ответ

Взгляните на этот вопрос с сегодняшнего утра - может дать вам хорошее начало - С# общий список <T> как получить тип T?

  • 0
    Действительно, замените List на Func и все готово ...
  • 0
    да, похоже, это сделает это для меня. спасибо Теперь у меня проблема, что компилятор не разрешает мне приводить из () => Resolve (theArgumentType) обратно к исходному T (даже если я сначала пытаюсь привести к объекту). «Невозможно преобразовать лямбда-выражение в тип« T », потому что это не тип делегата»
1

Я неправильно понял ваш вопрос.

Невозможно сделать это в одной функции так, как вы пытаетесь, потому что компилятор должен иметь тип делегата для создания лямбды во время компиляции.

Однако это должно работать.

public T Resolve<T>()
{
    return (T)Resolve(typeof(T));
}

public Func<T> LazyResolve<T>()
{
    return () => Resolve<T>();
}
  • 0
    хорошо, я думаю, что понимаю, почему это невозможно. Позор, потому что это было бы хорошей функцией для контейнера IoC.
0

В ответ на вопрос в комментарии вам нужно вызвать выражение лямбда, а не произносить его.

  • 0
    Я пока не хочу вызывать его, я хочу передать сам Func, чтобы вызывающий мог вызвать его, когда он будет готов
  • 0
    Затем вам нужно привести его к Func <T>.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню