У меня есть такой способ:

public void SomeMethod<TParser, T1, T2> () where TParser : IParser<T1, T2>, new() 
{
   ...
}

Интерфейс IParser<T1, T2> и класс, который его реализует:

public interface IParser<T1, T2>
{
   ...
}

public class Parser : IParser<string, int>
{
   ...
}

Теперь мои вопросы: можно ли передать методу только TParser, поскольку существует набор ограничений, который как бы определяет T1 и T2. Так что можно было бы сделать что-то вроде следующего:

SomeMethod<Parser>();

Я бы предположил, что это невозможно, но было бы что-то подобное?

0
Twenty 21 Дек 2019 в 17:01
Нет, к сожалению, это невозможно, и это распространенная проблема C#.
 – 
Ondrej Tucny
21 Дек 2019 в 17:10
Ну, это настоящий позор ... Вы не знаете, есть ли какие-то планы на это?
 – 
Twenty
21 Дек 2019 в 17:11

1 ответ

Что вы можете сделать, так это определить неуниверсальную версию вашего интерфейса. И извлеките из него свой универсальный интерфейс и используйте неуниверсальную версию в качестве ограничения. И если у вас есть параметры типа T1 и T2, это не будет полезно.

internal interface IParser
{
... // if you can define any. or it can be empty also
}

public interface IParser<T1, T2> : IParser
{
   ...
}

И измените подпись метода на это:

public void SomeMethod<TParser> () where TParser : IParser new() 
{
   ...
}
0
Eldar 21 Дек 2019 в 17:34
Ну, это была только упрощенная версия моей реальной проблемы, мне нужны фактические типы T1 и T2 в методе для дальнейшего приведения и обработки. Спасибо за ответ в любом случае!
 – 
Twenty
21 Дек 2019 в 17:41