当我们可能有数百个对象时,在 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 是按位置而不是名称设置的(因此需要较少的输入)。它也比在运行时解析文本文件更有效。
假设我有一个 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 是按位置而不是名称设置的(因此需要较少的输入)。它也比在运行时解析文本文件更有效。