你如何创建一个类似数组的C#构造函数,它将允许“new MyClass(){obj1,obj2,obj3};”

时间:2011-03-29 01:58:41

标签: c# collections constructor

我正在尝试创建一个接受类似于字典,列表或数组的构造函数的类,您可以使用文字集合对象创建对象,但我无法找到如何创建这样的对象一个构造函数,如果它甚至可能的话。

MyClass obj = new MyClass()
{
    { value1, value2 },
    { value3, value4 }
}

3 个答案:

答案 0 :(得分:10)

您需要两件事来使集合初始化器工作:

  1. 实施IEnumerable(非通用版本)
  2. Add()与集合初始值设定项匹配的方法
  3. 这是一个看起来像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}}可以抛出异常。

    https://connect.microsoft.com/VisualStudio/feedback/details/654186/collection-initializers-called-on-collections-that-implement-idisposable-need-to-call-dispose-in-case-of-failure#

答案 1 :(得分:1)

变量构造函数如何:

public class MyClass
{
    public MyClass() {}
    public MyClass(params object[] list) { ... }
}

答案 2 :(得分:-2)

默认值不够好吗?

new MyClass {
   MyCol = {Value1, Value2, ... },
};