有没有办法让这个方法通用,所以我可以返回一个字符串,bool,int或double?现在,它返回一个字符串,但如果它能够找到“true”或“false”作为配置值,我想以bool为例。
public static string ConfigSetting(string settingName)
{
return ConfigurationManager.AppSettings[settingName];
}
答案 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:直接方法 - 为您期望的每种类型创建多个函数,而不是具有一个通用函数。
public static bool ConfigSettingInt(string settingName)
{
return Convert.ToBoolean(ConfigurationManager.AppSettings[settingName]);
}
选项2:当您不想使用精美的转化方法时 - 将值转换为对象,然后转换为泛型类型。
public static T ConfigSetting<T>(string settingName)
{
return (T)(object)ConfigurationManager.AppSettings[settingName];
}
注意 - 如果演员表无效(您的情况),这将抛出错误。如果您不确定类型转换,我不建议这样做,而是选择选项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作为我的返回值。这可能不是最佳做法,但它对我有用。此方法接受泛型类型的数组和要添加到数组末尾的值。然后复制该数组,并剥离第一个值,并将方法中的值添加到数组的末尾。最后一件事是我返回通用数组。