2012-09-17 30 views
2

我必须将一个对象转换为一个对象,其中我只是将typename作为一个字符串。Cast FullTypeName

例如:

我有型串System.DateTime和字符串2012-09-17T10:19:23.5369243+02:00。现在我想要一个DateTime的对象与字符串的值。

这可能吗?

+1

通常,这是不可能的,因为类的字符串表示通常不包含所有数据以从中重建对象。例如,考虑一个嵌套对象图。话虽如此,但对于某些类型来说是完全可能的。 –

+0

这是可能的,但它不是演员。请参阅[DateTime.Parse](http://msdn.microsoft.com/en-us/library/ey1cdcx8(v = vs.100).aspx)。不幸的是,没有任何通用的方法可以实现所有类型(可能是因为从字符串转换到字符串意味着很多不重要的细节,例如语言环境和自定义表示)。 –

+0

字符串到日期时间:http://msdn.microsoft.com/en-us/library/cc165448.aspx,在一般意义上,这可能很难做到所有类型的对象。 –

回答

1

您的问题的答案可以在所有其他答案中找到,等待拼凑在一起。:)

  1. 从类型字符串获取的类型,像akhisp说:

    Type dateTimeType = Type.GetType("System.DateTime"); 
    
  2. 现在,使用一个类型转换为字符串更改为日期时间:

    object date = Convert.ChangeType("2012-09-17T10:19:23.5369243+02:00", dateTimeType); 
    
0

我会做的是使用Type.GetType(String)方法来获取对象的类型。 然后,我会调用Activator.CreateInstance(Type Object [])来构造该对象的一个​​实例,假设您知道有一个构造函数接受一个字符串。

+0

但是,即使日期时间不具备这样的构造。此外,即使存在,并且即使我们可以假设这是我们需要的,我们仍然有字符串格式的问题... –

1

通常这种转换不会通过演员公开。这有很多原因(对于另一个问题它可能是一个不错的主题)。

有时,对象的字符串表示形式对于该对象来说非常“标准”。例如,一个颜色可能总是被序列化为逗号分隔的RGB三元组。

例如,当需要解析的类型引入依赖语言环境的表示形式时,情况变得更加困难:例如,日期。在这种情况下,框架设计人员决定不引入像IParseable这样的接口,并使用第3个对象:TypeConverter s,TypeDescriptor和转换类来完成这种工作。它使你的代码更复杂,但它允许管理非常复杂的转换将这项工作委托给另一个类,看看到:

对于基本类型,你可能甚至不需要使用它们:你可以依靠IConvertible接口和System.Convert类。

你不能用铸造做(感谢上帝,在我看来),但你可以写一个通用Parse方法接受一个string并返回你所需要的类型,是这样的:

T Parse<T>(string value) 

对于我记得有一个很好的开源类型转换库(Universal Type Converter)。它使用它可能发现的将所有类型转换为另一个类型的所有内容来管理大量转换(例如,想象一下,您可以使用多少个不同的字符串表示来为bool值)。即使你不会直接使用它,你应该阅读这篇文章,以了解这些东西是如何工作的(以及查看源代码以查看角落案例是如何处理的)。

+0

我认为这个问题是关于更多的东西:在*类型*也是一个字符串,而不仅仅是物体。 – svick

+0

@svick你是对的,这是微不足道的,但他可以去看一下[此帖](http://stackoverflow.com/questions/10938067/creating-an-object-from-from-an-id-or-名称/ 10938166#10938166)。 –