3

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

public abstract class aParameter<T>
{
    private T _parameter;

    public T Parameter
    {
        get { return _parameter;}
    }

    ...
}

然后我有这样的“类型”类:

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被输入我的代码。

4

3 回答 3

6

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

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

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

于 2012-12-20T09:58:44.373 回答
4

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

于 2012-12-20T09:58:56.517 回答
0

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

根据您正在做什么,有许多可能的方法:

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

    if(obj.GetType() == typeof(TextParameter)) { TextParameter p = obj as TextParameter // 做事 } else if obj.GetType() == typeof(IntParameter)) { IntParameter p = obj as IntParameter // 做东西 }

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

  3. 如果 aParameter 中有不依赖于类型的方法/属性,则将它们移动到较低级别的非泛型抽象类。这可以为您提供至少一些功能,而无需求助于类型转换。

于 2012-12-20T10:16:23.323 回答