我没有在现有问题中找到我的用例,所以我去了。 我有一个抽象类,有这样的泛型:
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
的抽象类,但是我想将它迁移到abstract,以便我可以简化我的“Type”类,而不是为每个“Type”重复相同的代码。
这里有什么想法吗?
修改
我忘了提到它将成为一个图书馆的一部分,意味着要在公司之间分发,所以我真的需要保护允许的类型。我不能仅仅将objects
提供给我的代码。
答案 0 :(得分:5)
你可能仍然需要非泛型接口(或Brandon所说的非泛型抽象基类),除非你开始使用对象。
原因是aParameter<String>
与aParameter<int32>
的类型不同,因此如果没有一些帮助,您将无法将它们放入一个字典中。
我首选的方法是声明一个非泛型接口,并将其用作字典的基础,然后在每个类型化泛型中实现,也可以在抽象基类中实现。这样你就可以在可能的情况下从基类继承,或者只是在你的某个类型需要从其他类型继承时实现接口 - 你将获得最大的灵活性。
答案 1 :(得分:4)
创建一个非泛型抽象基类,让你的泛型抽象类继承它。
答案 2 :(得分:0)
泛型类型的目的是(除其他外)您只能编写一次可用于多种类型的代码。但是,由于C#是强类型,编译器需要知道它在泛型类中处理的类型。这就是为什么你必须指定泛型的类型(即角度括号中的类型) 如果您没有指定泛型的类型,那么在您的示例中,编译器将不知道Parameter属性的类型。
根据您正在使用的具体方法,有许多可能的方法:
使用Dictionary<int, object>
。
读取值时,可以使用一堆if / elses来检查对象的特定类型并转换为适当的类型。 e.g。
if(obj.GetType()== typeof(TextParameter)) { TextParameter p = obj as TextParameter // 做东西 } 否则如果obj.GetType()== typeof(IntParameter)) { IntParameter p = obj as IntParameter // 做东西 }
有多个词典。 Dictionary<int, TextParameter>
,Dictionary<int, IntParameter>
等
如果aParameter中的方法/属性不依赖于类型,则将它们移动到较低级别的非泛型抽象类。这可以为您提供至少一些功能,而无需诉诸类型转换。