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

Mac*_*ver 150 .net c# generics return-type

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

    public static string ConfigSetting(string settingName)
    {  
         return ConfigurationManager.AppSettings[settingName];
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 323

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

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

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

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

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

  • /*代码将设置转换为T ...*/这里跟随整个小说:) (20认同)
  • 虽然这个答案当然是正确的,并且当你注意到满足OP的要求时,可能值得一提的是,单独方法(`ConfigSettingString`,`ConfigSettingBool`等)的旧方法具有方法体的优点,它将更短更清晰,更专注. (5认同)
  • @thecoshman:可以,但是如果不这样做,您将如何处理返回的值? (2认同)
  • 如果不推荐这样,那么泛型返回类型的目的是什么? (2认同)

Bro*_*ass 28

你可以使用Convert.ChangeType():

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


Rol*_*sta 10

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

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

    public static bool ConfigSettingInt(string settingName)
    {  
         return Convert.ToBoolean(ConfigurationManager.AppSettings[settingName]);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 选项2:当您不想使用花哨的转换方法时 - 将值转换为object,然后转换为泛型类型.

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

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

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

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

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

  • 为什么在'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));
    }
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

创建一个函数并传递泛型类型的输出参数。

 public static T some_function<T>(T output_object /*declare as Output object*/)
    {
        return output_object;
    }
Run Code Online (Sandbox Code Playgroud)