我如何使一个方法的返回类型泛型?

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

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

你需要让它成为一个泛型方法,就像这样:

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

我在整个代码中执行这个操作,并想要一种方法将其放入方法中。我想在这里分享这个,因为我不需要使用转换。ChangeType为返回值。这可能不是最好的做法,但对我来说很管用。此方法接受一个泛型类型的数组和一个要添加到数组末尾的值。然后复制数组,去掉第一个值,并将进入方法的值添加到数组的末尾。最后是返回泛型数组。

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

  1. 选择1:直截了当 -为你期望的每种类型创建多个函数,而不是只有一个泛型函数。

    public static bool ConfigSettingInt(string settingName)
    {
    return Convert.ToBoolean(ConfigurationManager.AppSettings[settingName]);
    }
    
  2. Option 2: When you don't want to use fancy methods of conversion - Cast the value to object and then to generic type.

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

    注意:如果强制转换无效(你的情况),将抛出一个错误。如果你不确定类型转换,我不建议这样做,而是选择选项3

  3. 选项3:具有类型安全的泛型创建一个泛型函数来处理类型转换。

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

    注意: T是期望的类型,注意这里的where约束(U的类型必须是IConvertible以避免错误)

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

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

您需要为通过该方法返回的值传递一个类型可种姓的类型。

如果您想要返回一个不能为所传递的泛型类型进行类型转换的值,则可能必须修改代码或确保为method的返回值传递一个可对其进行类型转换的类型。因此,不推荐使用这种方法。

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

 public static T some_function<T>(T output_object /*declare as Output object*/)
{
return output_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;
}