【问题标题】:Cast object according to string's value in C#根据C#中字符串的值强制转换对象
【发布时间】:2016-03-20 14:11:20
【问题描述】:

假设我有:

string ValueToCastTo;
object TheThing;

如果ValueToCastTo 设置为"int",我希望将TheThing 转换为int。 如果ValueToCastTo 设置为"DateTime",我希望将TheThing 转换为DateTime

我不能使用if 语句,因为字符串可以设置为任何值。

谢谢。

【问题讨论】:

  • 这听起来是个非常糟糕的主意。你想解决什么问题?
  • 请记住,您实际上无法将对象投射到您想要的任何东西上。 “对象”是基本级别的抽象。您只能将 TheThing 转换为该对象实际是什么、该对象实际是什么的父对象之一(包括“对象”)或它实现的接口。
  • 我需要将ValueToCastTo 的值转换为一个类型,以便我可以使用它来转换Object
  • @MutantNinjaCodeMonkey 我不能将空对象转换为其他对象,然后使用反射设置属性?
  • 如果您要使用反射,为什么不创建您需要的特定类型的对象?

标签: c# string object casting


【解决方案1】:

你需要:

也许运行时会计算出正确的转换,但通常不会。所以也写一大堆TypeConverter的实现然后用

当你完成后,静态类型仍然是object。但它将是您的新类型实例的句柄。这是否对你有帮助取决于你想用它做什么......

【讨论】:

    【解决方案2】:

    简短的回答:你不能。

    强制转换是您必须在编译时编写的东西,用于将 X 类型的变量分配给 Y 类型的对象。 强制转换意味着您在编译时就知道要分配的类型,因此您可以编写类似的东西

    int x = (int) y;
    string x = (string) y;
    

    对此有一些解决方法:在您的对象上使用TypeOf(),在运行时使用反射来检测对象的类型、属性和方法,或者使用dynamic 来避免编译时检查。

    但这实际上取决于你想从你的代码中得到什么。

    【讨论】:

      【解决方案3】:

      TypeOf() 可以用来获取类型然后进行反射。

      “C# - 反射对象用于在运行时获取类型信息。允许访问正在运行程序的元数据的类位于 System.Reflection 命名空间中。”

      你可以按照这条路得到你想要的。

      希望有帮助!

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-20
      • 2021-10-24
      • 1970-01-01
      相关资源
      最近更新 更多