How to dynamically cast an object of type string to an object of type T

安稳与你 提交于 2019-12-21 04:18:15

问题


I have this XML document

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

in my code and I'm trying to build an array of arguments containing the <PublishToPdf> node.

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

This breaks at compile time of course. I can't figure out how to cast the publishNode.InnerText('false') to a runtime defined object of type specified in the XML file and store it in an object (which will conserve the type).


回答1:


You can use Convert.ChangeType :

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



回答2:


You can't do exactly what you're trying to do. First, the typeof keyword does not allow for dynamic evaluation at runtime. There are means by which to do this using reflection, with methods like Type.GetType(string), but the Type objects returned from these reflective functions can't be used for operations like casting.

What you need to do is provide a means of converting your type to and from a string representation. There is no automatic conversion from any arbitrary type. For your example, you can use bool.Parse or bool.TryParse, but those are specific to the bool type. There are similar methods on most primitive types.




回答3:


The simple solution, assuming there is a limited number of possible types;

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);


来源:https://stackoverflow.com/questions/1465855/how-to-dynamically-cast-an-object-of-type-string-to-an-object-of-type-t

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!