我从数据库中提取序列化数据以及对象类型(其中一个字段包含对象类型,另一个字段包含序列化数据的XML字符串)。
我有一个具有序列化和反序列化方法的通用序列化程序:
public static class Serializer<T>
{
public static string Serialize(T objectData) { }
public static T Deserialize(string xmlData) { }
}
鉴于在数据库字段中指定了对象类型,有没有办法让我动态设置T是什么? - 这是我的想法(尽管这不起作用):
Type t = Type.GetType(objectTypeName);
t objData = Serializer<t>.Deserialize(objectXmlString);
我希望从switch语句中重构一些代码,其中T是一个设定值,但我无法弄清楚它是否可以完成,或者如果是这样,我将如何去做。
提前致谢。
答案 0 :(得分:5)
你可以这样做,但它涉及反思 - MakeGenericType
,特别是:
typeof(Serializer<>).MakeGenericType(t).GetMethod("Deserialize").Invoke(...);
我还没有完成,因为你的例子令人困惑;该方法是实例,但被称为静态。
有趣的是(也许),dynamic
可能会在4.0中变得更容易 - 我没有我的虚拟机,但想象一下:
static void SomeGenericMethod<T>(T arg) { Serializer<T>.SomeMethod(arg); }
...
dynamic obj = ...
SomeGenericMethod(obj);
我需要检查,但我期待会为我们做很多繁重的工作。
另一种常见方法是公开适用于Type
的方法,而不是通过泛型。
答案 1 :(得分:0)
没有。但是,创建序列化方法的额外重载来处理此要求应该不会太困难:
public string Serialize(Type objectType, object objectData) { }
public object Deserialize(Type objectType, string xmlData) { }
.NET中的序列化API无论如何都将Type
实例作为参数。