C#通用方法返回值

时间:2011-01-17 11:20:59

标签: c# generics

我只是在学习泛型,并对方法返回值有疑问。

说,我想要一个泛型方法,因为方法签名所需的通用部分只是返回值。该方法将始终采用一个字符串作为其参数,但可以返回double或int。这可能吗?

实际上我想取一个字符串,解析其中包含的数字(可以是double或int),然后返回该值。

感谢。

4 个答案:

答案 0 :(得分:16)

这样的东西?

void Main()
{
    int iIntVal = ConvertTo<int>("10");
    double dDoubleVal = ConvertTo<double>("10.42");
}

public T ConvertTo<T>(string val) where T: struct
{
    return (T) System.Convert.ChangeType(val, Type.GetTypeCode(typeof(T)));
}

答案 1 :(得分:10)

您不能从通用方法返回doubleint,也不会返回任何其他类型。

例如,我可能有一个Foo类,你的通用解析方法没有任何约束,将允许进行这个调用:

Foo result = Parse<Foo>("111");

你可以用数字做的最好的事情是只允许使用struct(值 - 类型)来限制你的功能。

T Parse<T>(string value) where T : struct;

但这将允许所有数字类型,以及任何其他值类型。

您可以按接口类型进行约束,但INumericdouble上没有int界面,因此您会陷入困境。

如果传入了错误的类型,你唯一能做的就是抛出异常 - 这通常不是很令人满意。

在这种情况下,您最好的方法是放弃泛型并使用单独命名的方法。

double ParseDouble(string value);
int ParseInteger(string value);

但是,当然,这不会帮助你学习泛型。遗憾。

答案 2 :(得分:9)

是的,这是可能的。

实施例

public T ParseValue<T>(String value) { 
    // ...
}

答案 3 :(得分:2)

你可以做点像......

   public TResult Parse<TResult>(string parameter)
    {
     /* do stuff */
    }

并像......一样使用它。

int result = Parse<int>("111");

然后它将取决于您在Parse方法中的实现。

希望它有所帮助。