所以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 方程序集)。
但是,它们是部分类,因此我可以使用具有统一属性名称和不同属性名称的匿名类型的签名创建一个接口,在部分中实现该接口,为“其他”中的缺失值创建虚拟属性类型,然后根据类型从各个属性中提取值..
..但这也是太多的工作..特别是如果我正在努力创建3个新项目(界面,2个部分)。将匿名类型创建为真正的类并从之前的 2 种类型转换它会更简单。
所有这一切都是问是否有任何聪明的方法来完成我想要的;允许智能感知工作的可选动态参数?
我知道这是一个愚蠢的问题..基本上相当于:如何在不实际定义的情况下定义一个类..只是想知道除了 Cast(T,Type) 路线之外是否有任何巫师在袖手旁观:)