我想将字符串转换为C#类型。这里的用例是,我将序列化的数据与类型一起存储在缓存中,然后将其强制转换回。我有一个名为DataEntities.Show的自定义类(其中DataEntities是一个命名空间)。如果我存储该类的类型"DataEntities.ShowEntity",然后尝试对其进行反序列化,那么一切都很好。
当我将List类型的对象存储在缓存中时,问题就开始了。其结果类型为"System.Collections.Generic.List`1[DataEntities.ShowEntity]",因此下面的查找失败,因为程序集只包含DataEntities.WhowEntity,而未找到结果类型。结果我得到一个null。
我可以想出一个丑陋的解决方案,解析字符串类型的前缀为"List"或"Enumeration",但必须有一种更优雅的方法。有什么建议吗?
private static Type GetGlobalType(string s)
{
Type t = null;
Assembly[] av = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly a in av)
{
Type[] types = a.GetTypes();
t = Type.GetType(s + "," + a.GetName());
if (t == null)
{
t = Type.GetType(s);
}
if (t != null)
break;
}
return t;
}
您自己处理选角的任何特定原因。您可以使用隐式声明,使用简单的XML序列化来处理此问题。
当类被反序列化时,它将在运行时自动设置正确的类型,而不需要强制转换。
var dataIn = new List<DataEntities.ShowEntity>();
Console.WriteLine("Type before serialization: " + dataIn.GetType());
var xs = new XmlSerializer(dataIn.GetType());
var xmlWriter = XmlWriter.Create(@"C:test.xml");
xs.Serialize(xmlWriter, dataIn);
xmlWriter.Close();
var xmlReader = XmlReader.Create(@"C:test.xml");
var dataOut = xs.Deserialize(xmlReader);
xmlReader.Close();
Console.WriteLine("Type after deserialization: " + dataOut.GetType());