如何在不声明泛型类型的情况下使用带有泛型的类

3

首先,我来自Java背景,请原谅我可能会犯一些错误:

这是我的类:

 class ParameterHandler<T>
 {

        public static Dictionary<string, Converter<T>> parameters = 
               new Dictionary<string, Converter<T>>();

        public static void addParameter(string parameterName, Converter<T> converter){
            parameters.Add(parameterName, converter);
        }

        static T getValue(string parameterName, string stringValue){
            return parameters[parameterName].getValue(stringValue);
        }
 }

这是我的Converter接口。

interface Converter <T>
{
        T getValue(string stringValue);
}

我想知道是否能在不将T声明为参数类型的情况下使用parameterhandler。
我只需要像这样做:
ParameterHandler.addParameter("some", Some Implementation for Converter)

为了让你全面了解,这是我为转换器之一的实现方案。

class IntConverter : Converter<int>
{
        int getValue(string stringValue)
        {
            return int.Parse(stringValue);
        }
}

你想在字典“参数”中拥有不同类型的转换器吗? - Taher Rahgooy
@TaherRahgooy 是的,我还有这个 public static Dictionary<string, Converter<T>> parameters = new Dictionary<string, Converter<T>>();,所以函数 addParameter 将只是在该字典中添加一个新条目。你懂我说的吧? - Marco Dinatsoli
这个键被用来做什么?它只是存储一个类型名称,还是可能会为每个 T 有多个转换器? - Basic
2个回答

4
您可以创建一个非泛型的ParameterHandler类,该类具有通用的addParameter方法:
public static class ParameterHandler
{
    public static void addParameter<T>(string name, Converter<T> c)
    {
        ParameterHandler<T>.addParameter(name, c);
    }
}

那么您可以使用。
ParameterHandler.addParameter("some", new IntConverter());

在这种情况下,我想告诉你更多,我有这个公共静态Dictionary<string,Converter<T>> parameters = new Dictionary<string,Converter<T>>();。请问我应该传递什么而不是T - Marco Dinatsoli
你能帮忙吗? - Marco Dinatsoli
@MarcoDinatsoli:这个定义在哪里?在这种情况下,Tint。如果您想在非泛型类型中声明它,则需要使用object作为T,并将各个Converter<T>实例包装在实现Converter<object>的类中。或者,您可以添加一个非泛型的Converter接口,其中包含一个object getValue(string stringValue);方法。 - Lee

4

您需要定义一个接口作为所有转换器的基础:

 interface Converter
 {
 }
 interface Converter<T> : Converter
 {
     T getValue(string stringValue);
 }

然后:

class ParameterHandler
{
    public static Dictionary<string, Converter> parameters = 
           new Dictionary<string, Converter>();

    public static void addParameter<T>(string parameterName, Converter<T> converter){
        parameters.Add(parameterName, converter);
    }

    static T getValue<T>(string parameterName, string stringValue){
        if(!parameters[parameterName] is Convereter<T>)
             throw new Exception("Invalid Type");

        return ((Convereter<T>)parameters[parameterName]).getValue(stringValue);
    }
}

请注意,在您的初始模型中,每种类型 T 都有一个不同的字典,Converter<int>.parametersConverter<double>.parameters 不相同。

这是不安全的,我不能将“对象”传递给我的字典。 - Marco Dinatsoli
@MarcoDinatsoli,是的,但在您的模型中,字典只能包含每个“T”类型的一个类型。 - Taher Rahgooy
我该如何使用getValue?我不能像这样做:ParameterHandler.getValue(key, value) - Marco Dinatsoli
ParameterHandler.getValue<int>(key, value),或将getValue的返回类型设置为对象。 - Taher Rahgooy
我不知道运行时的类型,猜测似乎没关系,谢谢。 - Marco Dinatsoli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接