C#中的TryGetValue对字符串不起作用,是吗?

时间:2010-05-28 15:03:25

标签: c# casting

对象Row是一个类,它具有属性为Values的字典。

以下是Values属性的扩展方法。

public static T TryGetValue<T>(this Row row, string key)
{
return TryGetValue(row, key, default(T));
}

public static T TryGetValue<T>(this Row row, string key, T defaultValue)
{
    object objValue;

    if (row.Values.TryGetValue(key, out objValue))
    {
        return (T)objValue;
    }

    return defaultValue;
}

如果我这样做:

user.Username = user.Values.TryGetValue<string>("Username");

如果密钥“username”不在Dictionary中,就会发生这种情况。

我得到一个例外,无效的演员:

出现以下错误:

System.InvalidCastException:指定的强制转换无效。

TryGetValue[T](Row row, String key, T defaultValue) 

TryGetValue[T](Row row, String key) 

所以我猜TryGetValue对字符串不起作用?

2 个答案:

答案 0 :(得分:5)

您是否有可能在词典中输入一个“用户名”键,其值为不是字符串

我在您的方法中添加了评论,说明了这可能会导致您的问题。

// I'm going to go ahead and assume your Values property
// is a Dictionary<string, object>
public static T TryGetValue<T>(this Row row, string key, T defaultValue)
{
    // objValue is declared as object, which is fine
    object objValue;

    // this is legal, since Values is a Dictionary<string, object>;
    // however, if TryGetValue returns true, it does not follow
    // that the value retrieved is necessarily of type T (string) --
    // it could be any object, including null
    if (row.Values.TryGetValue(key, out objValue))
    {
        // e.g., suppose row.Values contains the following key/value pair:
        // "Username", 10
        //
        // then what you are attempting here is (string)int,
        // which throws an InvalidCastException
        return (T)objValue;
    }

    return defaultValue;
}

答案 1 :(得分:3)

它应该可以正常工作,如果键“Username”在字典中具有相应的字符串值,或者根本不在字典中。

您收到InvalidCastException这一事实表明"Username"键的值不是字符串。