在C#中,有没有办法创建一个list
拥有多种类型?我的列表项可以是int
, string
, DateTime
, or char
。我知道使用List<object>
or 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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)