对象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
对字符串不起作用?
答案 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"
键的值不是字符串。