代码之家  ›  专栏  ›  技术社区  ›  Mike Atlas

是否改为使用泛型类型参数重载?

  •  3
  • Mike Atlas  · 技术社区  · 15 年前

    我想添加一个泛型类型方法 DoSomething<T>

    public void DoSomething<T>(Data data)
    {
        //do something with Data, it depends on the type of T
    }
    
    public void DoSomething(Data data, Type dataType)
    {
        DoSomething<dataType>(group);
    }
    

    然而, <dataType> 在新的 DoSomething

    有人能帮我理解我思维中的差距吗?它使上面的示例成为类型检查错误?我所做的只是。。。糟糕的设计?

    4 回复  |  直到 15 年前
        1
  •  15
  •   Jon Skeet    15 年前

    编译时 -你现在只知道它的类型 .

    有两种方法可以解决此问题:

    • 使用反射从非泛型代码调用泛型代码。这很麻烦,不会执行得很好,但您可以弃用非泛型代码并最终将其删除。

    或者你可以现在就把它移除,然后把所有的东西都修好:)

        2
  •  7
  •   Mara Morton    15 年前

    我通常发现更容易扭转方法之间的关系,即:

    private void DoSomething<T>(Data data)
    {
        DoSomething(data, typeof(T));
    }
    
    private void DoSomething(Data data, Type dataType)
    {
        ...
    }
    
        3
  •  6
  •   JaredPar    15 年前

    这里的问题是您混合了泛型参数和运行时类型信息。用于泛型参数的类型值必须在编译时建立,并嵌入到元数据中。类型 Type 是一个在编译时其值未知的构造。因此,这两种方法不兼容。

    在这里,您最好的选择是将原始剂量测定法作为主要方法,并将新的通用方法输入其中。

    static void DoSomething<T>(Data data) {
      DoSomething(data, typeof(T));
    }
    
    static void DoSomething(Data data, Type dataType) {
      ...
    }
    
        4
  •  1
  •   tinkertime    15 年前