抽象泛型和抽象列表

本文关键字:抽象 列表 泛型 | 更新日期: 2023-09-27 17:49:01

我没有在现有的问题中找到我的用例,所以我开始了。我有一个抽象类,它有这样的泛型:

public abstract class aParameter<T>
{
    private T _parameter;
    public T Parameter
    {
        get { return _parameter;}
    }
    ...
}

然后我有我的"Type"类,像这样:

public class IntParameter : aParameter<Int32>
{
    public IntParameter(Int32 value)
    {
        _parameter = value;
    }
}
 public class TextParameter : aParameter<String>
{
    public TextParameter(String value)
    {
        _parameter = value;
    }
}

现在,在我的应用程序代码中,我想用抽象泛型类创建一个字典,而不指定泛型类型。像这样:

...
private Dictionary<Int32, aParameter> _paramDict = new Dictionary<Int32, aParameter>();
...

在以前的版本中,我为aParameter使用接口而不是抽象类,但我想将其迁移到抽象,以便我可以简化我的"类型"类,而不是为每个"类型"重复相同的代码。

有什么想法吗?

编辑

我忘了说它将是一个库的一部分,打算在公司中分发,所以我真的需要确保允许的类型。我不能只允许objects被输入到我的代码中

抽象泛型和抽象列表

您可能仍然需要非泛型接口(或者如Brandon所说的非泛型抽象基类),除非您转而使用对象。

原因是aParameter<String>aParameter<int32>不是同一种类型,所以如果没有帮助,您将无法将它们放入同一个字典中。

我的首选方法是声明一个非泛型接口,并将其用作字典的基础,然后在每个类型化泛型和抽象基类中实现它。这样,您可以在可能的情况下从基类继承,或者在您的一个类型需要从其他类型继承时仅实现接口—您获得了最大的灵活性。

创建一个非泛型抽象基类,并从它继承你的泛型抽象类

泛型类型的目的是(除其他外)您只能编写一次可用于多种类型的代码。然而,由于c#是强类型,编译器需要知道它在泛型类中处理的是什么类型。这就是为什么你必须指定泛型的类型(即尖括号中的类型)。如果你不指定泛型的类型,那么在你的例子中,编译器将不知道Parameter属性的类型。

根据您对它的具体操作,有许多可能的方法:

  1. 使用Dictionary<int, object>。在读取值时,您可以使用一堆if/else来检查对象的特定类型并转换为适当的类型。例如

    if(obj.GetType() == typeof(TextParameter)){TextParameter p = obj as TextParameter//做点什么}如果obj.GetType() == typeof(IntParameter)){IntParameter p = obj as IntParameter//做点什么}

  2. 拥有多个字典。Dictionary<int, TextParameter>, Dictionary<int, IntParameter>

  3. 如果参数中有不依赖于类型的方法/属性,那么将它们移动到较低级别的非泛型抽象类中。这至少可以为您提供一些功能,而不必诉诸类型转换。