C# 如何将对象强制转换为仅在运行时已知的类型

C# 如何将对象强制转换为仅在运行时已知的类型,c#,reflection,casting,C#,Reflection,Casting,考虑以下情况。我有一本字典,还有一个字符串键。我在编译时不知道这两种类型,但在运行时知道它们。所以在编译时,它们只是对象。我想编一本电话字典。然而,由于键是“强制转换到对象”的字符串,因此会产生RuntimeBinderException。我想了解如何解决这个问题 以下是一些测试,演示了该问题: [TestMethod] public void ThisTestFails() { dynamic dictionary = getDict();

考虑以下情况。我有一本
字典
,还有一个
字符串键
。我在编译时不知道这两种类型,但在运行时知道它们。所以在编译时,它们只是对象。我想编一本电话字典。然而,由于键是“强制转换到对象”的字符串,因此会产生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";
[TestMethod]
public void ThisTestFails()
{
动态字典=getDict();
var key=getKey();
bool result=dictionary.ContainsKey(key);
断言(结果);
}
[测试方法]
公开作废ThisTestWorks()
{
动态字典=getDict();
var key=(字符串)getKey();
bool result=dictionary.ContainsKey(key);
断言(结果);
}
私有对象getDict()=>newdictionary(){{“abc”,“def”};
私有对象getKey()=>“abc”;
ThisTestFails
失败,出现
RunTimeBinderException
,而
ThisTestWorks
通过。因此,当两个测试中的
变量都包含一个字符串时,它在
ThisTestFails
中的明显类型是一个对象,不能在
字典中使用。ContainsKey


本质上,我需要解决的是在运行时将
变量“强制转换”为字符串。
ThisTestWorks
中的
(字符串)键
解决方案对我没有用处,因为在一般情况下,我在编译时不知道字典键的类型。你能做些什么来解决这个问题呢?

嗨,我想你正在寻找这样的东西

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

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

但这可能是另一个问题,因为您正在尝试查找“object”类型中包含的字符串(该类型是从诸如GetKey()之类的方法返回的),因此在containKey中,将对对象类型进行比较,对象类型的含义是引用,而不是字符串的值。

为什么字典使用
string
类型化键,当编译时键的实际类型未知时?您是否考虑过简单地使用
对象
类型作为键?如果字典的键可以是“任何类型的对象”,那么使用
对象
类型来表示键(而不是使用文本)更有意义。字符串键和值只是示例。实际上,字典是通过反射找到的,它具有非常合理的泛型类型参数,但客户端在运行时并不知道这些参数,因为字典可能来自许多不同类的属性。因此,不使用object作为键类型是有充分理由的。这可能是一个XY问题,因此您可能会从共享您试图解决的实际问题中受益。在许多情况下,
dynamic
在C#中可以避免。您确定
string
s已装箱吗?Hi@C.Evenhuis,getKey返回'object',因此我很确定它将装箱,但我没有测试它