【问题标题】:C# Type Casting at Run-Time Using Reflection使用反射在运行时进行 C# 类型转换
【发布时间】:2011-01-22 00:49:49
【问题描述】:

从这个问题的标题来看,我想做的事情可能是不可能的,所以我会描述我在做什么,你可以随时让我知道我做错了什么以及什么会更好实现我的目标的方法。

我有一个 XML 文件,它描述了 1) 派生自基本类型的自定义对象,以及 2) 内部字段名称和关联值。这些派生对象可能具有基类不知道的附加字段。

我将对象的类型提取为字符串,并将所有对象数据放入字典中,其中键是字段名称,值是字段的值。我使用字符串名称和对象的默认构造函数来实例化对象。我可以将对象的所有属性嗅探到 PropertyInfo[] 中。现在我需要获取所有字符串形式的值并将它们转换为正确的数据类型,以便我可以将它们加载到对象的属性中。 (当我输入这个时,听起来我正在采取一种保存状态并恢复它,但我只听说过这种事情。如果您想按照这些方式提出建议,请记住我无法从 XML 文件中读取数据,无法更改。)

我可以将所有字符串值转换为由 Type 对象给出的类型,并使用我制作的具有以下定义的蛮力函数:

public object convertMe(string v, Type t)

由于我不知道我在函数中抛出什么 Type,所以我不知道会返回什么,并且我无法显式转换 object分配给上述属性的正确类型。我一直在尝试以下类型的演员,但无济于事:

string objectType = /*read type string from XML*/;

... // Wherein I instantiate an object "theObject" and get PropertyInfo[] from it.
... // I also make sure that I'm trying to assign the correct data to
... // the correct property.

Type t = currentProperty.PropertyType;
object o = convertMe(value, Type.GetType(qtype));
currentProperty.SetValue(theObject, (t)o, null);  // Doesn't work
currentProperty.SetValue(theObject, (t)Convert.ChangeType(o, t), null);  // Doesn't work.  Apparently (t) is bad syntax.

最终,我的目标是创建对象的一个​​实例,并使用 XML 文件中的数据加载它,使数据类型不会被硬编码。我在 C# 中执行此操作的原因是因为它曾经是一个 Python 程序,我被分配将其翻译成 C# .NET 2.0。至少可以说这是一次学习经历。我创建“蛮力函数”的原因是因为我一直在寻找解决这个铸造问题的方法,但无论我尝试什么,我都无法让它发挥作用。我可能会使用纯武力自己完成此操作,但我认为一定有一个我缺少的优雅解决方案。

非常感谢任何帮助!

【问题讨论】:

    标签: c# dynamic casting


    【解决方案1】:

    你根本不需要任何演员。 PropertyInfo.SetValue 接受 object 类型的参数,所以只需将 o 传递给它,就可以了。

    【讨论】:

    • 好吧,我快死了。我要把这归结为代码盲。虽然 MSDN 文档说它需要一个对象,但显示其使用的每个示例都使用了正确的值类型,所以我从未建立过这种联系。非常感谢!
    【解决方案2】:

    你根本不需要演员表。强制转换仅在您尝试直接处理对象时有用,而不是在您使用反射时。

    当您设置属性时,您使用的是PropertyInfo.SetValue。这将object 作为值参数,因此无需尝试将其强制转换为特定类型(只要对象已经是正确的类型)。

    由于您已经完成了将对象放入正确类型的“convertMe”(强制转换或装箱为 Object),因此您已准备就绪 - 只需使用它即可。

    【讨论】:

      猜你喜欢
      • 2012-01-13
      • 2011-02-28
      • 2022-11-29
      • 2019-12-03
      • 2023-02-02
      • 2011-10-02
      • 2011-10-17
      • 1970-01-01
      • 2015-11-17
      相关资源
      最近更新 更多