如何实现类型指定的泛型方法?
我有MyClass<T> where T : IComparable
类,我想实现一个方法,如果T
是String
将被调用。我怎样才能做到这一点?如何实现类型指定的泛型方法?
现在,我有如下代码:
public void Method()
{
...
Type typeParameterType = typeof(T);
if (typeParameterType.Equals(typeof(String)))
{
// here I can't do (String) anyTTypeValue
// to call handleString(String) method
}
...
}
尝试:
(string)(object) anyTypeValue;
顺便说一句,你不必做的一切 - 你可以说:
if(anyTypeValue is string)
{
string strValue = (string)(object)anyTypeValue;
...
}
编辑:
正如@Ilya建议的那样,在引用类型和Nullable<T>
类型的情况下,可以使用as
。由于string
是引用类型,你可以这样做:
var strValue = anyTypeValue as string;
if(strValue != null)
{
...
}
但是,你不能做同样的事情与int
:
var intValue = anyTypeValue as int; //compiler error
另外请注意,你不能告诉如果strValue != null
是假的,因为anyTypeValue
是null
开头,或因为anyTypeValue
是不是字符串。
在一些使用情况下,这些不是问题,因此使用as
将是更可取的。
不会只是99%的时间? – Aron 2013-02-27 08:24:17
不,因为在调用它之前检查它是一个字符串。 – 2013-02-27 08:25:43
它的工作原理。这是一个解决方案。但为什么我不能'(String)anyTTypeValue'? – 2013-02-27 08:33:34
您可以利用as
运算符并检查valString
是否不为空。然后您将可以访问string
特定属性和方法。下面的代码片段将显示主要想法:
public void Method<T>(T val)
{
string valString = val as string;
if(valString != null)
{
Console.WriteLine (valString.Length);
}
}
Method("tyto"); //prints 4
Method(5); //prints nothing
这就是我正在建议的。使用'as'意味着你不需要投掷对象两次。 – 2013-02-27 08:29:26
谢谢!这是一个解决方案。但在我的情况下,我宁愿@Eren Ersonmez的方式,因为我必须投它两次:'temp.value =(T)(Object)BalanceString((String)(Object)temp.value,balanseLength);' – 2013-02-27 08:35:33
您也可以尝试使用'as as operator'将'temp.value'强制转换为'string' – 2013-02-27 08:39:23
不知道你为什么要这样做。 'T.ToString()'会有用吗? – 2013-02-27 08:29:56
是的,这也是一个解决方案! – 2013-02-27 08:40:14