有没有办法让这个方法通用,所以我可以返回一个字符串、布尔值、整数或双精度值?现在,它正在返回一个字符串,但如果它能够找到“true”或“false”作为配置值,我想返回一个 bool 例如。
public static string ConfigSetting(string settingName)
{
return ConfigurationManager.AppSettings[settingName];
}
dynamic
关键字,C# 可以为您做到这一点。这需要性能成本,但对于读取配置文件,性能成本几乎可以肯定是微不足道的。
您需要使其成为通用方法,如下所示:
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));
}
我不完全相信这一切都是个好主意,请注意...
您可以使用 Convert.ChangeType()
:
public static T ConfigSetting<T>(string settingName)
{
return (T)Convert.ChangeType(ConfigurationManager.AppSettings[settingName], typeof(T));
}
有很多方法可以做到这一点(按优先级列出,特定于 OP 的问题)
选项 1:直接方法 - 为您期望的每种类型创建多个函数,而不是使用一个通用函数。 public static bool ConfigSettingInt(string settingName) { return Convert.ToBoolean(ConfigurationManager.AppSettings[settingName]);选项 2:当您不想使用花哨的转换方法时 - 将值转换为对象,然后转换为泛型类型。公共静态 T ConfigSetting
U
中将第三个选项设为通用?这样做没有任何意义,而且它使方法更难调用。只需接受 IConvertible
。我认为这个问题不值得包含第二个选项,因为它没有回答所提出的问题。您可能还应该重命名第一个选项中的方法...
您必须将方法的返回值的类型转换为在调用期间传递给方法的通用类型。
public static T values<T>()
{
Random random = new Random();
int number = random.Next(1, 4);
return (T)Convert.ChangeType(number, typeof(T));
}
您需要为通过该方法返回的值传递一个可强制类型转换的类型。
如果您想要返回一个不可类型转换的值到您传递的泛型类型,您可能必须更改代码或确保您传递的类型可转换为方法的返回值。因此,不推荐这种方法。
return (T)Convert.ChangeType(number, typeof(T));
正是我所缺少的 - 欢呼
创建一个函数并将 put 参数作为泛型类型传递。
public static T some_function<T>(T out_put_object /*declare as Output object*/)
{
return out_put_object;
}
请尝试以下代码:
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;
}
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 作为我的返回值。这可能不是最佳实践,但对我有用。此方法接受一个泛型类型的数组和一个要添加到数组末尾的值。然后复制该数组,并删除第一个值,并将该方法中的值添加到数组的末尾。最后一件事是我返回通用数组。
不定期副业成功案例分享
ConfigSettingString
、ConfigSettingBool
等)的旧方法具有方法主体更短的优点,更清晰,更专注。