在 C# 中,有没有办法创建一个 list
拥有多种类型?我的列表项可以是 int
, string
, DateTime
, 或 char
.我知道使用 List<object>
或 ArrayList
但由于封装,这些都不是好的做法。有实现这一目标的好方法吗?我认为创建一个界面可能会有帮助,但我想不出办法。
最佳答案
为此,我想出了第二种但截然不同的方法(可能在其他答案中有所描述,但现在已在此处实现),这次利用隐式操作,并且还具有使用框架列表类型的能力:
void Main()
{
var list = new List<Item>
{
1,
"foo",
DateTime.Now,
'x'
};
foreach (var item in list)
{
Console.WriteLine (item.ToString());
}
int i = list[0];
string s = list[1];
DateTime dt = list[2];
char c = list[3];
Console.WriteLine ("int: {0}, string: {1}, DateTime: {2}, char: {3}", i, s, dt, c);
}
enum Kind
{
Int,
String,
DateTime,
Char
}
class Item
{
int intValue;
string stringValue;
DateTime dateTimeValue;
char charValue;
Kind kind;
public object Value
{
get
{
switch (kind)
{
case Kind.Int:
return intValue;
case Kind.String:
return stringValue;
case Kind.DateTime:
return dateTimeValue;
case Kind.Char:
return charValue;
default:
return null;
}
}
}
public override string ToString()
{
return Value.ToString();
}
// Implicit construction
public static implicit operator Item(int i)
{
return new Item { intValue = i, kind = Kind.Int };
}
public static implicit operator Item(string s)
{
return new Item { stringValue = s, kind = Kind.String };
}
public static implicit operator Item(DateTime dt)
{
return new Item { dateTimeValue = dt, kind = Kind.DateTime };
}
public static implicit operator Item(char c)
{
return new Item { charValue = c, kind = Kind.Char };
}
// Implicit value reference
public static implicit operator int(Item item)
{
if(item.kind != Kind.Int) // Optionally, you could validate the usage
{
throw new InvalidCastException("Trying to use a " + item.kind + " as an int");
}
return item.intValue;
}
public static implicit operator string(Item item)
{
return item.stringValue;
}
public static implicit operator DateTime(Item item)
{
return item.dateTimeValue;
}
public static implicit operator char(Item item)
{
return item.charValue;
}
}
关于c# - 具有多种类型的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30494850/