Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c#中使用泛型实现这一点_C#_Generics_.net 4.0 - Fatal编程技术网

如何在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);确保当地文化