使用Generic T确定编译器选择的过载

时间:2014-11-27 07:22:07

标签: c# .net generics overloading

我有以下代码。该计划是GetSetting()调用适当版本的FromString(),具体取决于T的类型。

public static T GetSetting<T>(PersistedSetting setting, T defaultValue = default(T))
{
    return FromString(RegistrySettings.GetSetting(setting.ToString()) as string, defaultValue);
}

private static string FromString(string value, string defaultValue)
{
    return value ?? String.Empty;
}

private static int FromString(string value, int defaultValue)
{
    int i;
    return int.TryParse(value, out i) ? i : defaultValue;
}

private static decimal FromString(string value, decimal defaultValue)
{
    decimal d;
    return decimal.TryParse(value, out d) ? d : defaultValue;
}

private static bool FromString(string value, bool defaultValue)
{
    bool b;
    return bool.TryParse(value, out b) ? b : defaultValue;
}

但是,在调用FromString()的行上,我收到编译错误:

  

最好的重载方法匹配&#39; ArticleManager.PersistedSettings.FromString(string,string)&#39;有一些无效的论点

编译器假定FromString(string, string)。有没有办法让它为T使用适当的重载?

修改

我不确定,但我对发生的事情的最好猜测是在编译时确定重载,而GetSetting()在运行时才知道类型。但是,如果这就是问题,那么如何解决这一特定问题呢?

1 个答案:

答案 0 :(得分:4)

重载选择确实在编译时发生。这就是问题所在。

您可以使用dynamic在运行时实现:

return FromString(RegistrySettings.GetSetting(setting.ToString()) as string, (dynamic)defaultValue);

在MSDN上阅读更多内容:Using Type dynamic (C# Programming Guide)

或者您可以使您的方法成为非泛型方法,并为GetSetting设置一组重载,例如

public static int GetSetting(PersistedSetting setting, int defaultValue = default(int))
{
    return FromString(RegistrySettings.GetSetting(setting.ToString()) as string, defaultValue);
}