如何在c#中使用泛型实现这一点
我有一个类似的代码:如何在c#中使用泛型实现这一点,c#,generics,.net-4.0,C#,Generics,.net 4.0,我有一个类似的代码: int GetIntValue(string name) { string valueString=GetValue(name); int value=int.Parse(valueString); return value; } double GetDoubleValue(string name) { string valueString=GetValue(name); double value=dou
int GetIntValue(string name)
{
string valueString=GetValue(name);
int value=int.Parse(valueString);
return value;
}
double GetDoubleValue(string name)
{
string valueString=GetValue(name);
double value=double.Parse( valueString, System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture);
return value;
}
其他类型的数字类型也有类似的代码
我想写这样的东西:
T getValue<T>(string name)
{
string valueString=GetValue(name);
T value=T.Parse(valueString, System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture);
return value;
}
T getValue(字符串名称)
{
string valueString=GetValue(名称);
T value=T.Parse(valueString,System.Globalization.NumberStyles.Any,CultureInfo.InvariantCulture);
返回值;
}
但它不起作用(T太笼统)。如何更改此代码以在c#中使用泛型
我正在使用.NET4
编辑
修复了删除键入错误的代码。问题是如何使用一种通用方法来解析int和double-right? 在问题的方法中有stringvaluestring=GetValue(string),可能是输入错误,因此该值 所以为了适应这个问题,这个方法应该是
private T Read<T>(string name)
{
string valueString=GetValue(name);
TypeConverter converter = TypeDescriptor.GetConverter(typeof (T));
try
{
return (T) converter.ConvertFromString(value);
}
catch (FormatException)
{
return default(T);
}
}
private T Read(字符串名称)
{
string valueString=GetValue(名称);
TypeConverter converter=TypeDescriptor.GetConverter(typeof(T));
尝试
{
return(T)converter.ConvertFromString(值);
}
捕获(格式化异常)
{
返回默认值(T);
}
}
问题是如何使用一种通用方法来解析int和double-right?
在问题的方法中有stringvaluestring=GetValue(string),可能是输入错误,因此该值
所以为了适应这个问题,这个方法应该是
private T Read<T>(string name)
{
string valueString=GetValue(name);
TypeConverter converter = TypeDescriptor.GetConverter(typeof (T));
try
{
return (T) converter.ConvertFromString(value);
}
catch (FormatException)
{
return default(T);
}
}
private T Read(字符串名称)
{
string valueString=GetValue(名称);
TypeConverter converter=TypeDescriptor.GetConverter(typeof(T));
尝试
{
return(T)converter.ConvertFromString(值);
}
捕获(格式化异常)
{
返回默认值(T);
}
}
如果T
实现以下功能,则可以使用:
T getValue(字符串名称),其中T:IConvertible
{
字符串值string=GetValue(字符串);
T value=(T)Convert.ChangeType(valueString,typeof(T));
返回值;
}
如果T
实现以下功能,则可以使用:
T getValue(字符串名称),其中T:IConvertible
{
字符串值string=GetValue(字符串);
T value=(T)Convert.ChangeType(valueString,typeof(T));
返回值;
}
这里有一件有趣的事情:由于第一行是相同的,您实际上是在询问如何在不提供具体类型的情况下调用Parse,但希望结果是具体类型?即使可以,也必须传递类型参数,例如getValue(value)
。为什么不首先调用double.ToParse
呢?您将把多个函数转换成一个泛型,里面有一种开关/case
(实际上不是一个,而是一种),您必须检查所有具有唯一解析的类型(或者如果您可以自己解析它们),然后为该类型调用它。另一种可能是反射,您检查该类型是否具有Parse
方法并以某种方式调用它。这里有一个有趣的问题:由于第一行是相同的,您实际上在询问如何在不提供具体类型的情况下调用Parse,但期望结果是具体类型?即使可以,也必须传递类型参数,例如getValue(value)
。为什么不首先调用double.ToParse
呢?您将把多个函数转换成一个泛型,里面有一种开关/case
(实际上不是一个,而是一种),您必须检查所有具有唯一解析的类型(或者如果您可以自己解析它们),然后为该类型调用它。另一种可能是反射,你们检查那个类型是否有Parse
方法,并以某种方式调用它。这是一个怎样的答案?和你们一起,答案有什么问题?问题是如何做一个方法,所以这里有什么错?也许你应该添加任何解释?这不是一个严格的答案。顺便说一句,使用首字母缩略词并不意味着F
不是它想要的is@wudzik你们读到问题了吗?他有两种方法来解析double和int,在我的例子中,如果调用Read(“11”,0),它将返回11,那么有什么不对?@VolodymyrBilyachat一开始它不会编译。尝试移除多余的大括号。。。另外,一个解释这是如何工作的以及为什么它能解决OP的问题的描述也会有所帮助。这是一个怎样的答案?WTF和你们这些家伙的答案有什么错?问题是如何做一个方法,所以这里有什么错?也许你应该添加任何解释?这不是一个严格的答案。顺便说一句,使用首字母缩略词并不意味着F
不是它想要的is@wudzik你们读到问题了吗?他有两种方法来解析double和int,在我的例子中,如果调用Read(“11”,0),它将返回11,那么有什么不对?@VolodymyrBilyachat一开始它不会编译。尝试移除多余的大括号。。。另外,一个解释这是如何工作的以及它为什么解决OP的问题的描述也会有所帮助。在我的代码中,我有:value=int.TryParse(valueString,System.Globalization.NumberStyles.Any,CultureInfo.InvariantCulture);以确保本地文化不会影响解析结果。如何使用此方法执行此操作?可以将CultureInfo.InvariantCulture
作为第三个参数传递。如果您确实需要Any
(与默认的相反),我不确定……也许您可以将其构建到您编写的IFormatProvider
,或者您只需要处理int
(以及您可以指定非默认NumberStyles
的任何其他类型)作为特例,在我的代码中有:value=int.TryParse(valueString,System.Globalization.NumberStyles.Any,CultureInfo.InvariantCulture);确保当地文化