如何使用具有泛型的类而不必声明泛型类型

本文关键字:不必 声明 泛型类型 何使用 泛型 | 更新日期: 2023-09-27 18:10:28

首先,我来自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.addParameter("some", Some Implementation for Converter)

,为了让你了解全局,这是我对Converter

的一个实现
class IntConverter : Converter<int>
{
        int getValue(string stringValue)
        {
            return int.Parse(stringValue);
        }
}

如何使用具有泛型的类而不必声明泛型类型

您必须为所有转换器定义一个基本接口:

 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不相同。

你可以用一个通用的addParameter方法创建一个非通用的ParameterHandler类:

public static class ParameterHandler
{
    public static void addParameter<T>(string name, Converter<T> c)
    {
        ParameterHandler<T>.addParameter(name, c);
    }
}

则可以使用

ParameterHandler.addParameter("some", new IntConverter());