我有以下代码。 GetSetting()
的计划是根据 T
的类型调用适当版本的 FromString()
。
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()
的那一行,我得到了编译错误:
The best overloaded method match for 'ArticleManager.PersistedSettings.FromString(string, string)' has some invalid arguments
编译器采用FromString(string, string)
。有没有办法让它为 T
使用适当的重载?
编辑:
我不确定,但我对正在发生的事情的最佳猜测是重载是在编译时确定的,而 GetSetting()
直到运行时才知道类型。但是,如果这就是问题所在,人们将如何解决这个特定问题?
最佳答案
重载选择确实发生在编译时。这就是问题所在。
您可以使用 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);
}
关于c# - 使用泛型 T 确定编译器选择的重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27165158/