创建检测和处理各种类型的通用方法

时间:2014-09-14 22:25:58

标签: c# generics

我正在尝试完成以下内容,但显然我不清楚如何创建通用方法,一般来说:

public static string DecNHex<T>(T val)
{
    if (val.GetType() is System.Runtime.InteropServices.HandleRef)
    {
        return "{ " + val.Handle.ToString() + " / " + val.Handle.ToString("x") + "}";
    }
    else
    {
        return "{ " + val.ToString() + " / " + val.ToString("x") + " }";
    }
}

的问题:

  1. 编译器说if (val.GetType() is X)比较永远不会评估为真。
  2. 编译器不允许第二个return语句,因为在val.ToString("x")中没有ToString()的重载,它接受一个参数。
  3. 我明白为什么抱怨。我如何解决这些问题?另外:我是不是能够处理这种“一般”?我是否必须为每种类型写一个if语句?如果是这样,我显然不明白“通用”方法的好处。

1 个答案:

答案 0 :(得分:2)

  1. 应该是if (val is X),而不是if (val.GetType() is X)。当且仅当Y is XY的实例时,表达式X才为真。 val.GetType()Type类的一个实例,它永远不是System.Runtime.InteropServices.HandleRef的实例。

  2. 没有任何通用约束,所有编译器都知道T继承Object。因此,ToString上只有一个T val方法重载,并且不需要任何参数。

  3. C#不支持语言级泛型专业化(如C ++模板专业化)。例如,您可以构建一个Dictionary<Type, Action> dict,然后执行dict[x.GetType()](x)之类的操作,但问题中的具体内容并不明确,因此我无法为您执行此操作。