从字典返回泛型类型(否则返回默认的通用值)

时间:2015-02-19 15:39:36

标签: c# json generics dictionary

我正在尝试将密钥传递给字典(对象)并获取值(可能是各种类型)或回退到我提供的默认值。

例如

// Called from some other method
// It should look in the dictionary for that key and return the value
// else return the int 365
GetValueFromSetting("numDaysInYear", 365)

public static T GetValueFromSettings<T>(string key, T defaultValue)
{
    // Settings is a dictionary, which I get in json form
    Dictionary<string, object> settingsDictionary = (Dictionary<string, object>)ParseConfig.CurrentConfig.Get<Dictionary<string, object>>("settings");

    if(settingsDictionary.ContainsKey(key))
    {
        return settingsDictionary[key];
    }

    return defaultValue;
}   

首先我得到了。无法将类型对象隐式转换为T.存在显式转换(您是否错过了转换?)

所以我用

转换了键返回
return (T)settingsDictionary[key];

这摆脱了编译错误,但我有InvalidCastExpections。例如,在json中,数字存储为35.0(这将是一个双倍),如果我调用:

GetValueFromSettings("someOffset", 32.0f);

当它在json中找到32.0的密钥并尝试转换为浮点数时,我会得到一个InvalidCastExpection。

我也尝试过使用泛型而不是对象:

public static T GetValueFromSettings<T>(string key, T defaultValue)
{
    // Settings is a dictionary, which I get in json form
    Dictionary<string, T> settingsDictionary = (Dictionary<string, T>)ParseConfig.CurrentConfig.Get<Dictionary<string, T>>("settings");

    if(settingsDictionary.ContainsKey(key))
    {
        return settingsDictionary[key];
    }

    return defaultValue;
}   

希望能解决它,但这也会导致无效的强制转换异常。这次它在字典上,因为json期望一种类型的字典。

我也见过System.Convert.ChangeType()但又没有运气。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:4)

您所看到的(在第一种情况下)是您无法从int打开到float。你在翻译字典时所看到的是Dictionary<string, object>不是Dictionary<string, float>,这对我来说似乎是完全合理的。

您可能想要使用:

// I don't *expect* that you need a cast herem, given the type argument
var settingsDictionary = ParseConfig.CurrentConfig.Get<Dictionary<string, object>>("settings");
object value;
if (!settingsDictionary.TryGetValue(key, out value))
{
    return defaultValue;
}
object converted = Convert.ChangeType(value, typeof(T));
return (T) converted;

这会处理更多转化 - 但如果没有合适的转化可用,则会引发异常。