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