2013-07-19 2 views
4

Возможно ли в C# создать общую функцию, где первый параметр является перечислением (один из нескольких, поэтому он должен быть общим, я думаю), а второй параметр вынужден быть значение из перечисления, выбранного в качестве первого параметра? Я понимаю, что дженерики должны использоваться, но я не могу придумать, как написать такое выражение, или если это возможно.Общая функция, где второй параметр зависит от первого

Редактировать: Добавлено пример кода Я знаю, что этот пример кода не работает, но он немного иллюстрирует направление, о котором я думал.

public List<int> Call<EnumValue>(Type enumType, EnumValue enumValue) where EnumValue : Enum.GetValues(typeof(enumType)) 
{ 
    // Something  
} 
+5

Вы не можете даже ограничить общий метод/класс применимым только к Enums. –

+1

Правильно, ближайший, я думаю, вы можете получить: public void enumFunction (t enumObject) Где t - тип перечисления, а enumObject - его экземпляр. – CurlyPaul

+0

Вы имеете в виду, что первым параметром должен быть тип перечисления, а второй - значение этого типа? Или вы просто имеете в виду, что оба параметра являются значениями одного и того же типа перечислений? –

ответ

4

Я не думаю, что возможно иметь такое ограничение времени компиляции. Лучшее, что вы могли бы сделать это во время выполнения проверки:

public List<int> Call<TEnum>(Type enumType, TEnum enumValue) 
{ 
    if(!enumType.IsAssignableFrom(typeof(TEnum))) 
     throw new ArgumentException(); 

    // Something 
} 

UPDATE: Хотя я не знаю, почему вы должны пройти Type, если он должен быть же типа, другой параметр в любом случае. Не могли бы вы избавиться от первого параметра?

public List<int> Call<TEnum>(TEnum enumValue) 
{ 
    Type enumType = typeof(TEnum); 

    // Something 
}  
+0

Хорошие решения, поскольку это невозможно сделать по-моему. Большое спасибо за помощь. – Ohlin

+0

@Ohlin альтернативное решение в моем обновлении. Посмотрите, работает ли это для вас. –

+0

Моя идея состояла в том, чтобы передать enum и заданное значение по умолчанию этого перечисления, но это может быть любой вид перечисления. Я собираюсь попробовать ваше решение. – Ohlin

2

Единственный способ я думаю, что делать что-то подобное, добавляя условие внутри функции и либо вернуть что-то или выбросить исключение, если параметр является неправильным (с четким объяснением).

+0

Да, это был мой план резервного копирования ... – Ohlin

Смежные вопросы