【问题标题】:How to return a value based on the type of the generic T如何根据泛型 T 的类型返回值
【发布时间】:2010-06-16 14:45:05
【问题描述】:

我有一个类似的方法:

public T Get<T>(string key)
{

}

现在说如果类型是字符串,我想返回“hello”,如果是 int 类型,我想返回 110011。

我该怎么做?

typeof(T) 似乎不起作用。

理想情况下,我想做一个 switch 语句,并根据泛型的类型(string/int/long/etc)返回一些东西。

这可能吗?

【问题讨论】:

  • 那为什么不使用单独的方法呢?那是为了使用泛型而使用泛型。

标签: c# asp.net generics


【解决方案1】:

以下应该可以工作

public T Get<T>(string key) { 
   object value = null;
   if ( typeof(T) == typeof(int) ) { 
     value = 11011;
   } else if ( typeof(T) == typeof(string) ) { 
     value = "hello";
   }
   return (T)value;
}

【讨论】:

  • 如果T 不存在于if-else if 结构中,是否应该将value 初始化为default(T) 而不是null 以避免NullReferenceException?跨度>
  • @Anthony,这是一个有效的建议。在这种情况下,尽管作者没有指定意外类型的行为,所以最好直接通过 :)
  • 我心想,NRE 可能很好,因为该行为未在 if-else if 中定义,但后来我考虑了它的不一致,因为引用类型可能未处理且 不是 抛出。
【解决方案2】:

就我个人而言,我认为这对于泛型方法来说是一种糟糕的模式。

泛型应该支持跨底层类型无关紧要的不同对象类的“泛型”操作。当然,不包括当您将其限制为类层次结构的一个分支时...此时您最好通过直接编辑父类代码或扩展方法将方法添加到父类。

从您开始向泛型方法添加特定于类型的代码的那一刻起,您就已经越界,需要重新考虑特定类型的方法是否更适合您的情况。

【讨论】:

    【解决方案3】:

    我想知道这个问题的真正意图是什么... Get 方法是否应该从某种存储中检索指定的 key 的值?在那种情况下,我会想象像

    public T Get<T>(string key)
    {
        // GetValue(key) returns a value of type object.
        return (T)_storage.GetValue(key);
    }
    

    会更合适。到目前为止提出的答案根本没有使用key 参数(我认为这是合法的,因为原始问题试图根据T 的类型硬编码某种返回值,不管@ 987654326@代表)。

    您通常使用泛型来提供泛型行为,而不管您处理的是什么类型。如果您开始引入 switch 语句来修改基于方法的 Type 的行为,那么您可能没有正确使用泛型,并且/或者您应该考虑实现单独的、特定于类型的方法。

    【讨论】:

      【解决方案4】:

      如果您使用 switch 语句按Type 进行分类,那么您的方法可能不适合泛型,因为这意味着您的方法基于它正在使用的Type 具有不同的行为。泛型方法不应该关心。

      【讨论】:

      • 是的,Jared Par 提出的解决方案在我看来属于“仅仅因为你可以,并不意味着你应该”这一类。公平地说,他正试图解决 OP 的问题。真正的问题是问题本身反映了一种糟糕的方法。
      【解决方案5】:

      由于T 不是此方法的参数,因此无法从用法中推断出来。所以,你目前的用法是:

      int x = obj.Get<int>("key");
      

      既然如此,为什么不直接返回object?你的用法是:

      int x = (int)obj.Get("get");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-22
        • 2020-01-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多