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从您的示例中,您似乎知道该类型。尽管如此,您可以只使用
对象
(正如其他人已经说过的)。如果需要,仍然可以使用模式匹配。