首页 > 解决方案 > 将对象类型转换为仅在运行时知道的所述类型的变量

问题描述

有人可以帮我理解为什么以下不起作用吗?

void test(int i)
{
    Console.WriteLine("int");
}

void test(String s)
{
    Console.WriteLine("String");
}

void runMe()
{
    object obj = 1;
    Type t = typeof(int);
    test((t)obj);
}

您收到“找不到类型或命名空间名称‘t’”错误。

有没有办法使这项工作?我需要将对象转换为仅在运行时才知道的特定类型,但我发现的所有选项都只是转换数据但仍将它们存储在对象中。

编辑:添加了一些伪方法以提供更多上下文。

标签: c#castingruntime

解决方案


看起来您基本上是在尝试执行动态调度。你尝试它的方式是行不通的,因为当你使用静态类型时,所有的重载决议都是在执行时执行的。

但是,您可以使用动态类型来代替dynamic类型。此时,重载决议在执行时执行:

void Test(int i)
{
    Console.WriteLine("int");
}

void Test(String s)
{
    Console.WriteLine("String");
}

void RunMe()
{
    dynamic obj = 1;
    // The right overload is picked at execution time
    Test(obj);
}

这将完成您在问题中显示的内容 - 但这不一定是最好的方法。如果您可以坚持使用静态类型(不使用反射),我会这样做。如果你只能处理一组已知的类型,你可能想要保留 aDictionary<Type, Action<object>>或类似的东西......尽管你需要考虑一些尴尬的事情,比如子类型等。

如果您确实使用动态类型,我会尝试将它用于您的一小部分代码。一旦您可以“摆脱”动态类型,就这样做(例如,通过将动态绑定调用的结果转换为其预期的返回类型)。


推荐阅读