如何实现类型指定的泛型方法?

问题描述:

我有MyClass<T> where T : IComparable类,我想实现一个方法,如果TString将被调用。我怎样才能做到这一点?如何实现类型指定的泛型方法?

现在,我有如下代码:

public void Method() 
    { 
     ... 

     Type typeParameterType = typeof(T); 
     if (typeParameterType.Equals(typeof(String))) 
     { 
      // here I can't do (String) anyTTypeValue 
      // to call handleString(String) method 
     } 

     ... 
    } 
+0

不知道你为什么要这样做。 'T.ToString()'会有用吗? – 2013-02-27 08:29:56

+0

是的,这也是一个解决方案! – 2013-02-27 08:40:14

尝试:

(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是假的,因为anyTypeValuenull开头,或因为anyTypeValue不是字符串

在一些使用情况下,这些不是问题,因此使用as将是更可取的。

+0

不会只是99%的时间? – Aron 2013-02-27 08:24:17

+0

不,因为在调用它之前检查它是一个字符串。 – 2013-02-27 08:25:43

+0

它的工作原理。这是一个解决方案。但为什么我不能'(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 
+0

这就是我正在建议的。使用'as'意味着你不需要投掷对象两次。 – 2013-02-27 08:29:26

+0

谢谢!这是一个解决方案。但在我的情况下,我宁愿@Eren Ersonmez的方式,因为我必须投它两次:'temp.value =(T)(Object)BalanceString((String)(Object)temp.value,balanseLength);' – 2013-02-27 08:35:33

+0

您也可以尝试使用'as as operator'将'temp.value'强制转换为'string' – 2013-02-27 08:39:23