作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下情况。我有一个 Dictionary<string,string> dictionary
, 和一个 string key
.我在编译时不知道这两种类型,但我在运行时知道它们。所以在编译时,它们只是对象。我想调用 dictionary.ContainsKey(key)。但是,因为 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
中的解决方案对我没有用,因为在一般情况下我在编译时不知道字典键的类型。可以做些什么来解决这个问题?
最佳答案
您好,我想您正在寻找这样的东西
dynamic dictionary = getDict();
dynamic key = getKey();
bool result = (bool)dictionary.ContainsKey(key);
Assert.IsTrue(result);
但这可能是另一个问题,因为您正在尝试寻找一个装在“对象”类型中的字符串(此类型是从您的方法返回的,例如 GetKey()),因此在 containKey 方法中将对对象进行比较type 表示按引用而不是字符串的值。
关于c# - 如何将对象转换为仅在运行时已知的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45481969/
我是一名优秀的程序员,十分优秀!