【问题标题】:How to dynamically cast an object of type string to an object of type T如何将字符串类型的对象动态转换为 T 类型的对象
【发布时间】:2009-09-23 13:03:26
【问题描述】:

我有这个 XML 文档

<AdditionalParameters>
<PublishToPdf Type ="System.Boolean">False</PublishToPdf>
</AdditionalParameters>

在我的代码中,我正在尝试构建一个包含 &lt;PublishToPdf&gt; 节点的参数数组。

object test = (object) ((typeof(publishNode.Attributes["Type"].value)) publishNode.InnerText);

这当然会在编译时中断。我不知道如何将publishNode.InnerText('false') 转换为 XML 文件中指定类型的运行时定义对象并将其存储在对象中(这将保留类型)。

【问题讨论】:

    标签: c# generics casting


    【解决方案1】:

    您可以使用Convert.ChangeType

    object value = Convert.ChangeType(stringValue, destinationType);
    

    【讨论】:

    • 是的,要获取destinationType,使用var destinationType = Type.Parse(publishNode.Attributes["Type"].value);
    • Type.Parse() 似乎不存在。你的意思是 Type.GetType() 吗?
    【解决方案2】:

    你不能完全按照你想做的事情去做。首先,typeof 关键字不允许在运行时进行动态评估。有一些方法可以使用反射来做到这一点,比如Type.GetType(string),但是从这些反射函数返回的Type对象不能用于像转换这样的操作。

    您需要做的是提供一种将您的类型转换为字符串表示和从字符串表示转换的方法。没有任意类型的自动转换。对于您的示例,您可以使用 bool.Parsebool.TryParse,但这些特定于 bool 类型。大多数原始类型都有类似的方法。

    【讨论】:

      【解决方案3】:

      简单的解决方案,假设可能的类型数量有限;

      object GetValueObject(string type, string value)
      {
        switch (type)
        {
          case "System.Boolean":
            return Boolean.Parse(value);
          case "System.Int32":
            return Int32.Parse(value);
          ...
          default:
            return value;
        }
      }  
      
      var type = publishNode.Attributes["Type"].value;
      var value = publishNode.InnerText;
      var valueObject = GetValueObject(type, value);
      

      【讨论】:

      • 我正在使用 .net 框架 2.0。而且我没有var。您建议的解决方案是实现创建各种类型对象的工厂,这些对象数不胜数。不过还是谢谢你的帮助。
      • 嗯,var 只是为了让代码更短,你可以使用 string、string、object 这三个来代替。而且,正如我所说,如果您只需要支持有限数量的类型,这将很好。如果不是,那么你说它不实用是对的。
      • 例如,使用 C# 6,您可以使用 case nameof(System.Guid):。不再需要 const 字符串。 nameof 是编译时生成的。
      猜你喜欢
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 2012-09-02
      相关资源
      最近更新 更多