我可以实现泛型类型并将其传递给仅在运行时已知的类型吗?

时间:2009-10-27 13:04:07

标签: c# .net serialization

我从数据库中提取序列化数据以及对象类型(其中一个字段包含对象类型,另一个字段包含序列化数据的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是一个设定值,但我无法弄清楚它是否可以完成,或者如果是这样,我将如何去做。

提前致谢。

2 个答案:

答案 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实例作为参数。