Я использую 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
".
Затем я попытался использовать перегрузку GetMethod
, которая принимает массив System.Type
для разрешения привязки:
GetMethod("Serialize", new[] { typeof(Stream), instance.GetType() })
Но это только что сделало результат GetMethod
null
.
Как я могу использовать отражение, чтобы получить MethodInfo
вместо void Serializer.Serialize<T>(Stream, T)
, где T
равно instance.GetType()
?