Условная логика для подключения общих аргументов метода .Net - PullRequest
2 голосов
/ 13 марта 2012

У меня есть метод C # что-то вроде:

private static IEnumerable<T2> SomeMethod<T1, T2>(IEnumerable<T1> arg1)
{

}

и я хотел бы иметь возможность сделать некоторую условную логику, чтобы, если T1 - это A, то T2 - это B и так далее. Это не проблема, если у меня есть эти два ограничения. Однако, что, если я также хотел логику, например, если T1 - это C, то T2 - это D.

Проверка может быть выполнена методом, конечно, но проверка времени компиляции была бы предпочтительнее. Я хотел бы указать это в общем выражении where метода.

Есть ли способ сделать это на C # или любом другом языке .net?

Для получения дополнительной информации T1 в основном является объектом данных, а T2 является спецификатором, который относится к объекту данных T1. Все действительные T1 - это определенный базовый класс, в то время как все действительные T2 - это другой базовый класс. Это два разных класса, но всегда используются вместе. Проблема, которую я пытаюсь избежать, заключается в наличии в коде данных и другого спецификатора, который не совпадает с данными, передаваемыми вместе.

1 Ответ

5 голосов
/ 13 марта 2012

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

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

РЕДАКТИРОВАТЬ: Учитывая эту информацию, это может иметь больше смысла:

Для получения дополнительной информации T1 в основном является объектом данных, а T2 является спецификатором, который относится к объекту данных T1. Все действительные T1 - это определенный базовый класс, в то время как все действительные T2 - это другой базовый класс.

Не совсем понятно, что вы подразумеваете здесь под «спецификатором», но звучит так, как будто вы хотите, чтобы T2 выражался через интерфейс, который связывает его с T1. Например, если это на самом деле * типы "сущность" и "декоратор для сущности", вы можете иметь:

private static IEnumerable<T2> SomeMethod<T1, T2>(IEnumerable<T1> arg1)
    where T2 : IDecorator<T1>

... где IDecorator<T> - новый интерфейс. Опять же, по-прежнему недостаточно информации, чтобы сказать, но подобные вещи могут быть верным подходом.

...