假设我有一个类,它具有以下构造函数:
TestClass();
TestClass(int payloadLength);
TestClass(param byte[] payload);
并且,对于我的应用程序,我需要创建此类的多个对象,所有这些对象均具有不同的值。比方说:
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"
};
问题是,我需要初始化该类的许多对象。我们可以有数百个对象。
有没有简单的方法可以初始化它们,就像使用XMacros在C / C ++中进行初始化一样?还是类似的东西?
注意:在此示例中,我使用obj1和obj2作为实例的名称,但是在实际应用程序中,实例的名称应该有效。
在这里-使用集合初始化语法。有点像是由宏驱动的,但不是。
首先创建您的TestClass类。我想这就是您想在您的问题中包含的内容(但没有这样做-您键入它会很不错):
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;
}
}
然后,创建专用的收集类。请注意,它实现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
。然后将其添加到其私人收藏中。
最后,这是一些创建集合的代码。请注意,各种初始化器都与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语法,但是参数/属性是通过位置而不是名称来设置的(因此,它需要更少的键入)。它比在运行时解析文本文件要有效得多。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句