C# 如何创建一个类似C“构造函数”的数组来允许;新MyClass(){obj1,obj2,obj3}&引用;

C# 如何创建一个类似C“构造函数”的数组来允许;新MyClass(){obj1,obj2,obj3}&引用;,c#,collections,constructor,C#,Collections,Constructor,我正在尝试创建一个类,该类接受类似于字典、列表或数组的构造函数,您可以在其中使用对象的文本集合创建对象,尽管我一直无法找到如何创建这样的构造函数(如果可能的话) MyClass obj = new MyClass() { { value1, value2 }, { value3, value4 } } 默认值还不够好吗 new MyClass { MyCol = {Value1, Value2, ... }, }; 要使集合初始值设定项正常工作,需要两件事: 实施IEn

我正在尝试创建一个类,该类接受类似于字典、列表或数组的构造函数,您可以在其中使用对象的文本集合创建对象,尽管我一直无法找到如何创建这样的构造函数(如果可能的话)

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

默认值还不够好吗

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

要使集合初始值设定项正常工作,需要两件事:

  • 实施
    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;
    
    由于temp变量的原因,如果任何
    Add()
    调用生成异常,则从未实际分配指定的变量(
    obj
    )。有趣的是,这也意味着如果
    MyClass
    要实现
    IDisposable
    ,那么当其中一个
    Add()
    方法生成错误时,
    Dispose()
    将不会在构造的对象上被调用(我对此进行了测试以确保)

    为什么需要
    IEnumerable
    ?因为该接口将集合的类与计算的类区分为
    Add

    [当您使用
    Add
    ]分析类时,您会发现名称“Add”有两种根本不同的含义:

    a) 将参数插入集合,或

    b) 返回参数和接收器的算术和

    还请注意,如果您的集合类实现了
    IDisposable
    ,那么如果
    Add()
    有可能引发异常,或者提供给
    Add()
    的任何表达式都可能引发异常,则不应使用集合初始值设定项


    变量构造函数如何:

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

    你是说对象初始值设定项?C#3及以上版本具有集合初始值设定项,可以以几乎任何可以想象的方式实现这一点。我不明白你为什么要试图重新创造一些已经存在的东西。@Derek Beattie,
    集合初始值设定者
    ,来自你引用的同一链接。@Robert:我猜想OP是在问如何创建一个类,然后可以使用集合初始值设定者语法进行初始化。@Robert Harvey,实现自定义集合有很多原因。见鬼,.NET4添加了许多新的集合,因此显然还有很大的改进空间。仍然是。我知道
    Add
    方法下的代码是什么样子的,但是
    GetEnumerator
    下的代码是什么样子的?它只是一个普通的
    IEnumerator
    ?它是否需要与集合初始值设定项中的值具有相同的形状?@Robert Harvey,出于某种原因,它基于非通用
    IEnumerator
    接口,而不是通用接口。您甚至不必强制执行
    GetEnumerator()
    您只需让它
    抛出新的NotImplementedException()
    ,集合初始值设定项仍然可以正常工作。@Robert,@Samuel:如果你感兴趣,这里有一个关于
    IEnumerable
    /
    Add
    要求背后的基本原理的讨论:@LukeH,谢谢你的链接。我在回答中加入了一句话,使之更加完整。