当我们可能有数百个对象时,在 C# 中初始化多个实例及其属性的最简单方法是什么?

What is the easiest way to initialize mutliple instances and its properties in C#, when we could have hundreds of objects?

假设我有一个 class,它有以下构造函数:

TestClass();
TestClass(int payloadLength);
TestClass(param byte[] payload);

而且,对于我的应用程序,我需要创建此 class 的多个对象,所有对象都具有不同的值。比方说:

TestClass obj1 = new TestClass(0)
{
    id = 0x01;
    value = 0x25;
    name = "First Object"
};

byte[] obj2Payload = new byte[] { 0x00, 0x00, 0x02 };

TestClass obj2 = new TestClass(obj2Payload)
{
    id = 0x02;
    value = 0x53;
    name = "Second Object"
};

问题是,我需要初始化这个 class 的很多对象。我们可以有数百个对象。

有没有一种简单的方法来初始化它们,就像您在 C/C++ 中使用 XMacros 所做的那样?或者类似的东西?

注意:在这个例子中我使用了obj1和obj2作为实例的名称,但在实际应用中,实例的名称应该是有意义的。

给你 - 使用 Collection Initialization 语法。它有点像 macro-driven,但不是。

首先创建你的测试类class。这就是我想你打算包含在你的问题中的内容(但没有 - 如果你输入它会很好):

public class TestClass
{
    public int Id { get; set; }
    public int Value { get; set; }
    public string Name { get; set; }

    private byte[] _payload;


    public TestClass()
    {
        _payload = new byte[0];
        Name = string.Empty;
    }

    public TestClass(int payloadLength)
    {
        _payload = new byte[payloadLength];
        Name = string.Empty;
    }

    public TestClass(byte[] payload)
    {
        _payload = payload;
        Name = string.Empty;
    }
}

然后我创建我的 purpose-built collection class。请注意,它实现了 IEnumerable 并具有正确签名的 Add 方法(实际上,它具有多个重载的 Add 方法)。 IEnumerable 实现以正常方式使用简单的 yield return 语句:

public class TestCollection : IEnumerable<TestClass>, IEnumerable
{
    private readonly List<TestClass> _items = new List<TestClass>();

    public void Add(int id, int val, string name)
    {
        var item = new TestClass
        {
            Id = id,
            Value = val,
            Name = name,
        };
        _items.Add(item);
    }

    public void Add(int id, int val, string name, int payloadLength)
    {
        var item = new TestClass(payloadLength)
        {
            Id = id,
            Value = val,
            Name = name,
        };
        _items.Add(item);
    }

    public void Add(int id, int val, string name, params byte[] payload)
    {
        var item = new TestClass(payload)
        {
            Id = id,
            Value = val,
            Name = name,
        };
        _items.Add(item);
    }

    public IEnumerator<TestClass> GetEnumerator()
    {
        foreach (var item in _items)
        {
            yield return item;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

这些 Add 方法中的每一个都接受它传递的参数并使用它们创建一个 TestClass。然后它将其添加到其私有 collection.

最后,这里是一些创建 collection 的代码。请注意,各种 初始化程序 Add 方法的签名相匹配。

var stuff = new TestCollection
{
    {0x01, 0x25, "First Object"},
    {0x01, 0x53, "Second Object"},
    {0x03, 0x42, "With Payload Length", 12},
    {0x04, 0xff, "With a Payload as an Array", new byte[] {1, 2, 3, 4}},
    {0x05, 0xab, "With a Payload as a params Array", 1, 2, 3, 4},
};

语法让人想起 JSON 语法,但 parameters/properties 是按位置而不是名称设置的(因此需要较少的输入)。它也比在运行时解析文本文件更有效。