Есть ли название для этого шаблона?
Допустим, вы хотите создать метод, который принимает переменное число аргументов, каждый из которых должен быть одним из фиксированного набора типов (в любом порядке или комбинации), а некоторые из этих типов вы не можете контролировать. Обычный подход заключается в том, чтобы ваш метод принимал аргументы типа 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); }
}
Неявное приведение позволяет вам передавать аргументы допустимых типов непосредственно в вашу подпрограмму без необходимости явного приведения или переноса их. Если вы попытаетесь передать значение недопустимого типа, ошибка будет обнаружена во время компиляции.
Я уверен, что другие использовали этот подход, поэтому мне интересно, есть ли название для этого шаблона.