我正在使用C#/.NET 4.0和Protocol Buffers库(protobuf-net),该库提供以下功能。
问题在于
然后我尝试使用带有
public static class Serializer {
public static void Serialize<T>(Stream destination, T instance);
public static void Serialize<T>(SerializationInfo info, T instance);
public static void Serialize<T>(XmlWriter writer, T instance);
public static void Serialize<T>(SerializationInfo info, StreamingContext context, T instance);
public static T Deserialize<T>(Stream source);
}
我需要用非泛型等价物包装这两个调用。 具体而言,我想要
void SerializeReflection(Stream destination, object instance);
object DeserializeReflection(Stream source, Type type);
只需在运行时调用Serializer
的相应通用成员即可。 我已使用以下代码使DeserializeReflection
方法运作:
public static object DeserializeReflection(Stream stream, Type type)
{
return typeof(Serializer)
.GetMethod("Deserialize")
.MakeGenericMethod(type)
.Invoke(null, new object[] { stream });
}
SerializeReflection
方法是让我感到困扰的原因。起初,我尝试了以下代码:
public static void SerializeReflection(Stream stream, object instance)
{
typeof(Serializer)
.GetMethod("Serialize")
.MakeGenericMethod(instance.GetType())
.Invoke(null, new object[] { stream, instance });
}
问题在于
typeof(Serializer)
和.Invoke(...)
之间的部分无法正常工作。调用GetMethod("Serialize")
会出现AmbiguousMatchException
,因为有四个方法名为“Serialize
”。然后我尝试使用带有
System.Type
数组参数的GetMethod
重载来解决绑定问题:GetMethod("Serialize", new[] { typeof(Stream), instance.GetType() })
但这样只会使得GetMethod
的结果变成null
。
我应该如何使用反射来获取void Serializer.Serialize<T>(Stream, T)
方法的MethodInfo
,其中T
是instance.GetType()
?