我正在尝试创建一个接受类似于字典,列表或数组的构造函数的类,您可以使用文字集合对象创建对象,但我无法找到如何创建这样的对象一个构造函数,如果它甚至可能的话。
MyClass obj = new MyClass()
{
{ value1, value2 },
{ value3, value4 }
}
答案 0 :(得分:10)
您需要两件事来使集合初始化器工作:
IEnumerable
(非通用版本)Add()
与集合初始值设定项匹配的方法这是一个看起来像IDictionary的例子:
class Program
{
static void Main(string[] args)
{
MyClass obj = new MyClass()
{
{value1, value2},
{value3, value4}
};
}
}
public class MyClass : IEnumerable
{
public void Add(object x, object y)
{
}
public IEnumerator GetEnumerator()
{
}
}
请注意,集合初始化程序代码直译为:
MyClass temp = new MyClass();
temp.Add(value1, value2);
temp.Add(value3, value4);
MyClass obj = temp;
由于临时变量,如果任何Add()
调用生成异常,则实际上永远不会分配命名变量(在这种情况下为obj
)。有趣的是,这也意味着如果MyClass
要实现IDisposable
,那么当Dispose()
方法之一产生错误时,Add()
就不会在构造对象上调用(I {}测试这是肯定的。)
为什么需要IEnumerable
?因为该接口将具有Add
的类与具有Add
的集合和类进行区分以进行计算。
http://blogs.msdn.com/b/madst/archive/2006/10/10/what-is-a-collection_3f00_.aspx
[当您使用
Add
分析课程时]您意识到“添加”这个名称基本上有两种截然不同的含义:a)将参数插入集合或
b)返回参数和接收器的算术和
另请注意,如果您的集合类实现IDisposable
,那么如果Add()
有可能抛出异常或者任何表达式被馈送到{{{}},则不应使用集合初始值设定项。 1}}可以抛出异常。
答案 1 :(得分:1)
变量构造函数如何:
public class MyClass
{
public MyClass() {}
public MyClass(params object[] list) { ... }
}
答案 2 :(得分:-2)
默认值不够好吗?
new MyClass {
MyCol = {Value1, Value2, ... },
};