Есть ли способ, которым я не могу указать источник из IQueryable в методе расширения? [Дубликат]

Вы также можете исправить эту проблему, используя аннотацию @Service в классе службы и передав требуемый bean classA в качестве параметра в другой конструктор класса bean bean и аннотировать конструктор класса B с @Autowired. Пример фрагмента здесь:

@Service
public class ClassB {

    private ClassA classA;

    @Autowired
    public ClassB(ClassA classA) {
        this.classA = classA;
    }

    public void useClassAObjectHere(){
        classA.callMethodOnObjectA();
    }
}
13
задан Jahan Zinedine 18 December 2010 в 11:48
поделиться

3 ответа

Спецификация ограничивает вывод параметра типа для общих методов ко всем или ничто. Вы не можете иметь частичный вывод.

Обоснование, вероятно, упрощает правила вывода типов (которые уже довольно сложны, так как они также должны учитывать правила перегрузки).

13
ответ дан Mehrdad Afshari 22 August 2018 в 19:52
поделиться
  • 1
    Я догадался, что, так что я изменяю параметры таким образом, чтобы выводимый тип был последним параметром, но без шансов. – Jahan Zinedine 18 December 2010 в 11:29
  • 2
    @Jani: Заказ здесь не имеет значения. Любой компилятор может вывести все аргументы типа для вас, и в этом случае вы можете опустить их все или не можете вывести хотя бы один. В последнем случае вам всегда нужно явно указать all . – Mehrdad Afshari 18 December 2010 в 11:32
  • 3
    Для статики вы можете обойти это, поместив функцию в класс фиктивного набора инструментов с общими параметрами; то вы можете дать явные параметры классу, в то время как выведенные из них находятся в функции. – Nyerguds 9 May 2018 в 09:15

Я использовал решение Marc Gravell и вроде этого, но я могу представить другую альтернативу.

Поскольку общие параметры выводятся из параметров, другой вариант заключается в том, чтобы вместо этого использовать параметр out для результата возвращаемого значения.

Это возможно в течение длительного времени, но сегодняшний C # позволяет объявить переменную inline, которую я считаю полезным для использования.

public static void Cast<T1, T2>(this T1 arg, out T2 result) where T2 : class where T1 : class
{
    result = arg as T2;
}

Вы можете назвать это следующим образом

objOfTypeT1.Cast(out Type2 objOfTypeT2);
0
ответ дан Grax 22 August 2018 в 19:52
поделиться

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

.Cast().To<Type2>()

, имея (непроверенный, только указательный)

public static CastHelper<T> Cast<T>(this T obj) {
    return new CastHelper<T>(obj);
}
public struct CastHelper<TFrom> {
    private readonly TFrom obj;
    public CastHelper(TFrom obj) { this.obj = obj;}
    public TTo To<TTo>() {
       // your code here
    }
}
16
ответ дан Marc Gravell 22 August 2018 в 19:52
поделиться
  • 1
    Помните, что я предоставляю возвращаемый тип. Я хочу не предоставлять объект, который я назвал функцией на нем, метод - это метод расширения. – Jahan Zinedine 18 December 2010 в 11:41
  • 2
    @Jani и посмотрите на пример - я не включаю тип from; просто тип адресата. – Marc Gravell♦ 18 December 2010 в 12:27
  • 3
    Да, я бы сказал, что это единственный обходной момент на данный момент. – Lorenz Lo Sauer 3 September 2016 в 16:48
Другие вопросы по тегам:

Похожие вопросы: