Таким образом, C# поддерживает необязательные параметры:
void MethodName(string param = "optional!") { }
И параметры динамического метода:
void MethodName(dynamic param) { }
Но, к сожалению, вы не можете использовать их вместе (необязательные значения параметров должны быть константами):
void MethodName(dynamic param = new { p1 = "", p2 = 0M }) { }
Я использовал такие вещи в прошлом:
void GenericAnonHandler<T>(IEnumerable<T> param)
{
foreach(T item in param)
{
var typedItem = Cast(item, new { p1 = "", p2 = 0M });
var p2 = typedItem.p2; // Hark, IntelliSense!
}
}
static T Cast<T>(object obj, T type)
{
return (T)obj;
}
void CallingMethod()
{
var list1 = new List<ThisType>() { ... };
var list2 = new List<ThatType>() { ... };
var anon1 = list1
.Select(x =>
new { p1 = x.sPropName, p2 = x.dPropName });
var anon2 = list2
.Select(x =>
new { p1 = x.sPropName2, p2 = x.dPropName2 });
var both = anon1.Concat(anon2);
GenericAnonHandler(both);
}
но это много дополнительной работы и кодирования для конкретного типа, где новый класс или просто использование динамического было бы проще, если вы ЗНАЕТЕ, каким должен быть динамический тип ... но динамика не дает IntelliSense (и разумно так).
Я бы предпочел использовать интерфейс, но не могу, потому что исходные типы (в этом примере: ThisType, ThatType) имеют разные имена свойств, и я не могу их контролировать (сторонняя сборка).
Однако они ЯВЛЯЮТСЯ частичными классами, поэтому я мог бы создать интерфейс с сигнатурой анонимного типа с унифицированными именами свойств И разными именами свойств, реализовать интерфейс в частичном, создать фиктивные свойства для отсутствующих значений из "другого" введите, а затем извлеките значения из соответствующих свойств в зависимости от типа.
... но это также слишком много работы ... особенно, если я приложу все усилия, чтобы создать 3 новых элемента (интерфейс, 2 частичных). Было бы проще создать тип анона как настоящий класс и перевести его из 2-х предыдущих типов.
Все, что нужно, чтобы спросить, есть ли какие-нибудь умные способы добиться того, чего я хочу; необязательные динамические параметры, которые позволяют работать intellisense?
Я знаю, что это глупый вопрос.. и в основном сводится к следующему: как я могу определить класс, не определяя его на самом деле.. просто интересно, есть ли какие-нибудь волшебники с трюками в рукавах, кроме маршрута Cast(T,Type) :)