【发布时间】:2018-11-07 01:44:02
【问题描述】:
我正在尝试列出泛型类型(实际上我只需要字符串和 int)。两个对象都有名称(字符串)但值不同(整数或字符串)
public class Setting
{
public string Name { get; set; }
}
public class Setting<T> : Setting
{
public T Value { get; set; }
public Type Type
{
get
{
return typeof(T);
}
}
}
名单如下:
List<Setting> list = new List<Setting>();
list.Add(new Setting<int> { Name = "one", Value = 10 } );
list.Add(new Setting<string> { Name = "two", Value = "string value" });
但是,当我尝试获取该值时,它是不存在的。
list[0].Value ????
这个可以吗?
编辑:
令人惊讶的是它是多么简单(与泛型、接口相比),感谢@Patrick Hofman 的“对象”提示。
public class Settings
{
public string Name { get; set; }
public object Value { get; set; }
}
Fields = new List<Settings>{
new Settings { Name = "Three", Value = "Three_value" },
new Settings{ Name = "Four", Value = 22 },
new Settings { Name = "Two", Value = "22" }
}
像魅力一样工作。
【问题讨论】:
-
不,这是不可能的。首先:泛型应该适用于 any 类型,而不仅仅是
string和int。第二:你应该问问自己,这些类型有什么共同点。有什么可以用字符串 和 整数来完成的吗?从我的角度来看,并不多。不要将没有任何共同点的类型实例放入一个非泛型列表中。即使你能做到这一点,当你写list[0]时,你期望什么类型?编译器肯定只能提供Setting,但你永远不会知道它实际上是Setting<string>还是Setting<int>。 -
C# 不能很好地支持这个习语,因为它不支持 sum 类型(AKA discriminated unions)。你能得到的最好的结果是通过
object工作。 (或者使用library,但对于简单的用例,它是矫枉过正的。) -
您的列表是针对
Setting键入的,它没有Value属性。 -
另一个想法是有接口,例如
IValue,它定义了object Value并让Setting<T>实现它,但是你有List<IValue>并且不能在没有强制转换的情况下调用Setting的方法。
标签: c#