c#类处理不同的数据类型
我想用以下方式表示系统的数据:c#类处理不同的数据类型,c#,C#,我想用以下方式表示系统的数据: abstract class Param { public object value; private string name; public Param(string name) { this.name = name; } } class Param_Int : Param { new public int value; public Param_Int(string name )
abstract class Param
{
public object value;
private string name;
public Param(string name)
{
this.name = name;
}
}
class Param_Int : Param
{
new public int value;
public Param_Int(string name ) : base(name)
{
this.value = 1;
}
}
class Param_Double: Param
{
new public double value;
public Param_Double(string name) : base(name)
{
this.value = 1.0;
}
}
class Param_String : Param
{
new public string value;
public Param_String(string name) : base(name)
{
this.value = "Hello World";
}
}
List<Param> lst = new List<Param>();
Param_Int pi = new Param_Int("test int");
pi.value = 10;
lst.Add(pi);
Param_Double pd = new Param_Double("test double");
pd.value = 3.14;
lst.Add(pd);
foreach (Param p in lst)
{
// here i want to use p.value and always have to corresponding data type
}
其中涉及到一些参数,所有这些参数都共享一些公共属性,如一些寄存器id、访问级别等,并具有更新或发送等功能,以便通过某些硬件接口进行通信。我希望存储在一些列表中,然后通过以下方式访问它们:
abstract class Param
{
public object value;
private string name;
public Param(string name)
{
this.name = name;
}
}
class Param_Int : Param
{
new public int value;
public Param_Int(string name ) : base(name)
{
this.value = 1;
}
}
class Param_Double: Param
{
new public double value;
public Param_Double(string name) : base(name)
{
this.value = 1.0;
}
}
class Param_String : Param
{
new public string value;
public Param_String(string name) : base(name)
{
this.value = "Hello World";
}
}
List<Param> lst = new List<Param>();
Param_Int pi = new Param_Int("test int");
pi.value = 10;
lst.Add(pi);
Param_Double pd = new Param_Double("test double");
pd.value = 3.14;
lst.Add(pd);
foreach (Param p in lst)
{
// here i want to use p.value and always have to corresponding data type
}
List lst=new List();
Param_Int pi=新的Param_Int(“测试Int”);
pi.value=10;
第一次添加(pi);
参数双pd=新参数双(“测试双”);
pd.value=3.14;
第一次增补(pd);
foreach(lst中的参数p)
{
//在这里,我想使用p.value,并且始终必须使用相应的数据类型
}
如何使用C#实现这种行为?不同的数据类型不需要不同的类。
对象
变量可以保存任何类型的值:
public class Param
{
public object Value;
private string name;
public Param(string name)
{
this.name = name;
}
}
用法示例:
var intParam = new Param("my int");
intParam.Value = 10;
var stringParam = new Param("my string");
stringParam.Value = "Hello";
var list = new List<Param>();
list.Add(intParam);
list.Add(stringParam);
foreach(var item in list)
Console.WriteLine(item.Value);
对于第一部分,即变量类型,您应该了解泛型:
abstract class Param<T>
{
public T value;
private string name;
public Param(string name)
{
this.name = name;
}
}
class Param_Double: Param<double>
{
public Param_Double(string name) : base(name)
{
this.value = 1.0;
}
}
我不觉得这是代码,但如果您不想更改代码,可以尝试以下方法:
foreach (Param p in lst)
{
if(p is Param_Int){
Param_Int param_Int = p as Param_Int;
Console.WriteLine(param_Int.value);
} else if (p is Param_Double){
Param_Double param_Double = p as Param_Double;
Console.WriteLine(param_Double.value);
} else if (p is Param_String){
Param_String param_String = p as Param_String;
Console.WriteLine(param_String.value);
}
}
将其更改为泛型,您将只需要一个类。检查NET
KeyValuePair
,这与您试图创建的非常相似。我不确定泛型会有什么帮助,我是否需要在每次访问时指定数据类型。@如果他想在同一个列表中有不同的类型,该怎么办?检查这个问题:@w.b这根本不起作用。可以在该列表中存储不同的Param
,是的。但是如果在字段上循环,则无法访问值
字段。。。所以没用了,谢谢,一般来说,这会有所帮助,但需要先停止一些强制转换,然后再根据类型进行计算。@thefloe您想在什么上下文中使用这些值?您不应该将值类型存储为对象,因为这意味着不必要boxing@w.b在这种情况下,如果他想在游戏中使用不同的类型,就没有办法解决这个问题同样的清单@阿德里安:啊,现在我明白了,这实际上是可行的。谢谢。你想如何在同一个列表中混合不同的类型?你不能有列表>
这看起来很有趣。我如何在不再次指定泛型类型的情况下创建列表。@loe它不是possible@thefloe从您的示例中,您似乎知道该类型。尽管如此,您可以只使用对象
(正如其他人已经说过的)。如果需要,仍然可以使用模式匹配。