【发布时间】:2013-02-21 22:22:05
【问题描述】:
所以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 方程序集)。
但是,它们是部分类,因此我可以使用具有统一属性名称和不同属性名称的匿名类型的签名创建一个接口,在部分中实现该接口,为缺少的值创建虚拟属性'other' 类型,然后根据类型从各自的属性中提取值..
..但这也是太多的工作.. 特别是如果我正在努力创建 3 个新项目(界面,2 个部分)。将匿名类型创建为真正的类并从之前的 2 种类型转换它会更简单。
这就是询问是否有任何聪明的方法来完成我想要的;允许智能感知工作的可选动态参数?
我知道这是一个愚蠢的问题.. 基本上相当于:我如何定义一个类而不实际定义它.. 只是想知道除了 Cast(T,类型)路线:)
【问题讨论】:
-
你不能只使用普通的非匿名类型吗?
标签: c# dynamic parameters optional-parameters