我正在尝试完成以下内容,但显然我不清楚如何创建通用方法,一般来说:
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") + " }";
}
}
的问题:
if (val.GetType() is X)
比较永远不会评估为真。val.ToString("x")
中没有ToString()的重载,它接受一个参数。我明白为什么抱怨。我如何解决这些问题?另外:我是不是能够处理这种“一般”?我是否必须为每种类型写一个if
语句?如果是这样,我显然不明白“通用”方法的好处。
答案 0 :(得分:2)
应该是if (val is X)
,而不是if (val.GetType() is X)
。当且仅当Y is X
是Y
的实例时,表达式X
才为真。 val.GetType()
是Type
类的一个实例,它永远不是System.Runtime.InteropServices.HandleRef
的实例。
没有任何通用约束,所有编译器都知道T
继承Object
。因此,ToString
上只有一个T val
方法重载,并且不需要任何参数。
C#不支持语言级泛型专业化(如C ++模板专业化)。例如,您可以构建一个Dictionary<Type, Action> dict
,然后执行dict[x.GetType()](x)
之类的操作,但问题中的具体内容并不明确,因此我无法为您执行此操作。