如何使方法的返回类型通用?

时间:2012-03-21 15:44:20

标签: c# .net generics return-type

有没有办法让这个方法通用,所以我可以返回一个字符串,bool,int或double?现在,它返回一个字符串,但如果它能够找到“true”或“false”作为配置值,我想以bool为例。

    public static string ConfigSetting(string settingName)
    {  
         return ConfigurationManager.AppSettings[settingName];
    }

7 个答案:

答案 0 :(得分:299)

你需要使它成为通用方法,如下所示:

public static T ConfigSetting<T>(string settingName)
{  
    return /* code to convert the setting to T... */
}

调用者必须指定他们期望的类型。然后,您可以使用Convert.ChangeType,假设支持所有相关类型:

public static T ConfigSetting<T>(string settingName)
{  
    object value = ConfigurationManager.AppSettings[settingName];
    return (T) Convert.ChangeType(value, typeof(T));
}

我并不完全相信这一切都是个好主意,请注意......

答案 1 :(得分:25)

您可以使用Convert.ChangeType()

public static T ConfigSetting<T>(string settingName)
{
    return (T)Convert.ChangeType(ConfigurationManager.AppSettings[settingName], typeof(T));
}

答案 2 :(得分:8)

有很多方法可以做到这一点(优先级列出,特定于OP的问题)

  1. 选项1:直接方法 - 为您期望的每种类型创建多个函数,而不是具有一个通用函数。

    public static bool ConfigSettingInt(string settingName)
    {  
         return Convert.ToBoolean(ConfigurationManager.AppSettings[settingName]);
    }
    
  2. 选项2:当您不想使用精美的转化方法时 - 将值转换为对象,然后转换为泛型类型。

    public static T ConfigSetting<T>(string settingName)
    {  
         return (T)(object)ConfigurationManager.AppSettings[settingName];
    }
    

    注意 - 如果演员表无效(您的情况),这将抛出错误。如果您不确定类型转换,我不建议这样做,而是选择选项3.

  3. 选项3:具有类型安全性的通用 - 创建一个通用函数来处理类型转换。

    public static T ConvertValue<T,U>(U value) where U : IConvertible
    {
        return (T)Convert.ChangeType(value, typeof(T));
    } 
    

    注意 - T是预期的类型,请注意此处的where约束(U的类型必须是IConvertible以保存我们的错误)

答案 3 :(得分:6)

您必须将方法返回值的类型转换为在调用期间传递给方法的Generic类型。

    public static T values<T>()
    {
        Random random = new Random();
        int number = random.Next(1, 4);
        return (T)Convert.ChangeType(number, typeof(T));
    }

您需要为通过该方法返回的值传递类型为casteable的类型。

如果您希望返回一个不是类型的类型的值,您可能需要更改代码或确保传递一个类型,该类型对于方法的返回值是类型的。所以,这种方法并没有被推荐。

答案 4 :(得分:0)

创建一个函数,并传递普通类型的put参数。

App

答案 5 :(得分:0)

请尝试以下代码:

public T? GetParsedOrDefaultValue<T>(string valueToParse) where T : struct, IComparable
{
 if(string.EmptyOrNull(valueToParse))return null;
  try
  {
     // return parsed value
     return (T) Convert.ChangeType(valueToParse, typeof(T));
  }
  catch(Exception)
  {
   //default as null value
   return null;
  }
 return null;
}

答案 6 :(得分:-1)

 private static T[] prepareArray<T>(T[] arrayToCopy, T value)
    {
        Array.Copy(arrayToCopy, 1, arrayToCopy, 0, arrayToCopy.Length - 1);
        arrayToCopy[arrayToCopy.Length - 1] = value;
        return (T[])arrayToCopy;
    }

我在整个代码中执行此操作并想要一种方法将其放入方法中。我想在这里分享一下,因为我没有必要使用Convert.ChangeType作为我的返回值。这可能不是最佳做法,但它对我有用。此方法接受泛型类型的数组和要添加到数组末尾的值。然后复制该数组,并剥离第一个值,并将方法中的值添加到数组的末尾。最后一件事是我返回通用数组。