Чтобы ответить на дополнительный вопрос об ответе Эндрю Хэра, да, можно ограничить метод расширения In
одним перечислением.Не принимайте этот ответ, так как Эндрю и Тревор ответили на пересмотренный вопрос (и большинство ответили на оригинал ... в любом случае).
Напомним, это то, что я считаю наиболее полезным: https://stackoverflow.com/a/5320727/1169696
Но если вы действительно хотите ограничить его, это просто вопрос использования типа Enum в качестве параметра вместо универсального (или Enum):
// This is the one we want to use our In extension method on:
public enum FriendlyEnum
{
A,
B,
C
}
public enum EnemyEnum
{
A,
B,
C
}
// The extension method:
public static class FriendlyEnumExtensions
{
public static bool In(this FriendlyEnum value, params FriendlyEnum[] list)
{
return list.Contains(value);
}
}
class Program
{
static void Main(string[] args)
{
FriendlyEnum friendlyValue = FriendlyEnum.A;
EnemyEnum enemyValue = EnemyEnum.A;
// Outputs "True":
Console.WriteLine(friendlyValue.In(FriendlyEnum.A, FriendlyEnum.C));
// Outputs "False":
Console.WriteLine(friendlyValue.In(FriendlyEnum.B, FriendlyEnum.C));
// All of these will result in compiler errors,
// because EnemyEnum is invading some way or another:
Console.WriteLine(friendlyValue.In(EnemyEnum.A, EnemyEnum.B));
Console.WriteLine(enemyValue.In(FriendlyEnum.A, FriendlyEnum.B));
Console.WriteLine(enemyValue.In(EnemyEnum.A, EnemyEnum.B));
}
}
Я считаю его менее полезным, чем универсальныйЯ связал - или подход Тревора - но вы идете.
Обновление
Разница между подходами:
Использование Тревораметод, все три смеси врага и друга в приведенном выше коде будут приняты компилятором (выходные данные будут «True», «False», «False», «False», «True»).
При использовании универсального подхода будет принят последний (и «True»), поскольку универсальные шаблоны гарантируют, что все параметры (включая this
) имеют одинаковый тип.То есть он не будет принимать смешивание различных перечислений в одном вызове.
Приведенный выше, опять же, будет принимать только одно перечисление, для которого вы разработали метод расширения.