首页 文章

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

提问于
浏览
123

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

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

7 回答

  • 7

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

    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));
    }
    

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

  • 270

    你可以使用 Convert.ChangeType()

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

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

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

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

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

  • 24

    请尝试以下代码:

    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;
    }
    
  • 0
    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作为我的返回值 . 这可能不是最佳做法,但它对我有用 . 此方法接受泛型类型的数组和要添加到数组末尾的值 . 然后复制数组,并剥离第一个值,并将方法中的值添加到数组的末尾 . 最后一件事是我返回通用数组 .

  • -1

    有很多方法可以做到这一点(按优先级列出,具体针对OP的问题)

    • Option 1: Straight approach - 为您期望的每种类型创建多个函数,而不是具有一个通用函数 .
    public static bool ConfigSettingInt(string settingName)
    {  
         return Convert.ToBoolean(ConfigurationManager.AppSettings[settingName]);
    }
    
    • Option 2: When you don't want to use fancy methods of conversion - 将值转换为object,然后转换为泛型类型 .
    public static T ConfigSetting<T>(string settingName)
    {  
         return (T)(object)ConfigurationManager.AppSettings[settingName];
    }
    

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

    • Option 3: Generic with type safety - 创建一个通用函数来处理类型转换 .
    public static T ConvertValue<T,U>(U value) where U : IConvertible
    {
        return (T)Convert.ChangeType(value, typeof(T));
    }
    

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

  • 4

    创建一个函数并传递put参数作为泛型类型 .

    public static T some_function<T>(T out_put_object /*declare as Output object*/)
        {
            return out_put_object;
        }
    

相关问题