如何将对象转换为仅在运行时

时间:2017-08-03 10:44:05

标签: c# reflection casting

考虑以下情况。我有Dictionary<string,string> dictionarystring 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解决方案对我没用,因为我在一般情况下在编译时不知道字典键的类型。可以做些什么来解决这个问题?

1 个答案:

答案 0 :(得分:2)

您好我认为您正在寻找类似的东西

dynamic dictionary = getDict();
dynamic key = getKey();

bool result = (bool)dictionary.ContainsKey(key);
Assert.IsTrue(result);

但是这里可能是另一个问题,因为你正在尝试查找一个以'object'类型装箱的字符串(这种类型是从你的方法返回的,比如GetKey())所以在containsKey方法中,对象将进行比较。通过引用输入含义而不是字符串的值。