Есть ли имя для этого шаблона ?
Допустим, вы хотите создать метод, который принимает переменное количество аргументов, каждый из которых должен быть одним из фиксированного набора типов (в любом порядке или комбинации), а некоторые из этих типов вы не можете контролировать . Обычным подходом было бы, чтобы ваш метод принимал аргументы типа Object и проверял типы во время выполнения:
void MyMethod (params object[] args)
{
foreach (object arg in args)
{
if (arg is SomeType)
DoSomethingWith((SomeType) arg);
else if (arg is SomeOtherType)
DoSomethingElseWith((SomeOtherType) arg);
// ... etc.
else throw new Exception("bogus arg");
}
}
Однако, допустим, что, как и я, вы одержимы безопасностью типов во время компиляции и хотите иметь возможность для проверки типов аргументов вашего метода во время компиляции. Вот подход, который я придумал:
void MyMethod (params MyArg[] args)
{
// ... etc.
}
struct MyArg
{
public readonly object TheRealArg;
private MyArg (object obj) { this.TheRealArg = obj; }
// For each type (represented below by "GoodType") that you want your
// method to accept, define an implicit cast operator as follows:
static public implicit operator MyArg (GoodType x)
{ return new MyArg(x); }
}
Неявное приведение типов позволяет вам передавать аргументы допустимых типов непосредственно в вашу подпрограмму, без необходимости их явного приведения или обертывания. Если вы попытаетесь передать значение неприемлемого типа, ошибка будет обнаружена во время компиляции.
Я уверен, что другие использовали этот подход, поэтому мне интересно, есть ли имя для этого шаблона.