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)
我并不完全相信这一切都是个好主意,请注意......
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:直接方法 - 为您期望的每种类型创建多个函数,而不是具有一个通用函数.
public static bool ConfigSettingInt(string settingName)
{
return Convert.ToBoolean(ConfigurationManager.AppSettings[settingName]);
}
Run Code Online (Sandbox Code Playgroud)选项2:当您不想使用花哨的转换方法时 - 将值转换为object,然后转换为泛型类型.
public static T ConfigSetting<T>(string settingName)
{
return (T)(object)ConfigurationManager.AppSettings[settingName];
}
Run Code Online (Sandbox Code Playgroud)
注意 -如果演员表无效(您的情况),这将抛出错误.如果您不确定类型转换,我不建议这样做,而是选择选项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以保存我们的错误)
小智 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)