c# - 将对象类型转换为仅在运行时知道的所述类型的变量
问题描述
有人可以帮我理解为什么以下不起作用吗?
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’”错误。
有没有办法使这项工作?我需要将对象转换为仅在运行时才知道的特定类型,但我发现的所有选项都只是转换数据但仍将它们存储在对象中。
编辑:添加了一些伪方法以提供更多上下文。
解决方案
看起来您基本上是在尝试执行动态调度。你尝试它的方式是行不通的,因为当你使用静态类型时,所有的重载决议都是在执行时执行的。
但是,您可以使用动态类型来代替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>>
或类似的东西......尽管你需要考虑一些尴尬的事情,比如子类型等。
如果您确实使用动态类型,我会尝试将它用于您的一小部分代码。一旦您可以“摆脱”动态类型,就这样做(例如,通过将动态绑定调用的结果转换为其预期的返回类型)。
推荐阅读
- java - Mapstruct + lombok 无法在命令行中运行但在 IntelliJ 中工作
- amazon-web-services - 当文件大小高于 ~15MB 时,CloudWatch 事件不会触发 S3 PutObject 事件
- java - 设计枚举通用行为
- ansible - 告诉 Ansible 遍历(网络摄像机)配置 json 文件并通过新的 api 调用更新每个值
- php - TYPO3 和 Composer-Commands
- getgauge - Gauge_clear_state_level 如何与 Javascript 和 Typescript 一起工作?
- module - 在使用 Base 的 OCaml 中,如何构造一个包含 `int * int` 类型元素的集合?
- algolia - 从另一个名词推断一个名词
- python-3.x - 读取 df,拆分每个单元格并附加到列表
- ios - 苹果登录后退出