考虑以下情况。我有Dictionary<string,string> dictionary
和string key
。我在编译时不知道这两种类型,但我在运行时就知道它们。所以在编译时,它们只是对象。我想打电话字典.ContainsKey(键)。但是,因为key是一个“强制转换为对象”的字符串,所以会产生RuntimeBinderException。我想了解如何解决这个问题。
以下是一些证明问题的测试:
[TestMethod]
public void ThisTestFails()
{
dynamic dictionary = getDict();
var key = getKey();
bool result = dictionary.ContainsKey(key);
Assert.IsTrue(result);
}
[TestMethod]
public void ThisTestWorks()
{
dynamic dictionary = getDict();
var key = (string)getKey();
bool result = dictionary.ContainsKey(key);
Assert.IsTrue(result);
}
private object getDict() => new Dictionary<string, string>() { { "abc", "def" } };
private object getKey() => "abc";
ThisTestFails
失败并显示RunTimeBinderException
,而ThisTestWorks
则失败。所以,正在发生的事情是,虽然两个测试中的key
变量都包含一个字符串,但它在ThisTestFails
中的表观类型是一个对象,不能在dictionary.ContainsKey
中使用。
基本上,我需要解决这个问题的方法是在运行时将key
变量“转换”为字符串。 (string)key
中的ThisTestWorks
解决方案对我没用,因为我在一般情况下在编译时不知道字典键的类型。可以做些什么来解决这个问题?
答案 0 :(得分:2)
您好我认为您正在寻找类似的东西
dynamic dictionary = getDict();
dynamic key = getKey();
bool result = (bool)dictionary.ContainsKey(key);
Assert.IsTrue(result);
但是这里可能是另一个问题,因为你正在尝试查找一个以'object'类型装箱的字符串(这种类型是从你的方法返回的,比如GetKey())所以在containsKey方法中,对象将进行比较。通过引用输入含义而不是字符串的值。