Sto usando C# /. NET 4.0 e una libreria di buffer di protocollo (protobuf-net) che fornisce la seguente funzionalità.Utilizzo di System.Type per chiamare un metodo generico
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);
}
Ho bisogno di avvolgere due di queste chiamate con gli equivalenti non generici. In particolare, voglio
void SerializeReflection(Stream destination, object instance);
object DeserializeReflection(Stream source, Type type);
che semplicemente chiamare i rispettivi membri generiche di Serializer
in fase di esecuzione. Ho acquistato il metodo DeserializeReflection
di lavorare con il seguente codice:
public static object DeserializeReflection(Stream stream, Type type)
{
return typeof(Serializer)
.GetMethod("Deserialize")
.MakeGenericMethod(type)
.Invoke(null, new object[] { stream });
}
Il SerializeReflection
metodo è quello che mi sta causando problemi. Ho inizialmente provato il codice seguente:
public static void SerializeReflection(Stream stream, object instance)
{
typeof(Serializer)
.GetMethod("Serialize")
.MakeGenericMethod(instance.GetType())
.Invoke(null, new object[] { stream, instance });
}
Il problema è che la parte tra typeof(Serializer)
e .Invoke(...)
non funziona. La chiamata a GetMethod("Serialize")
mi ottiene un AmbiguousMatchException
, perché ci sono quattro metodi denominati "Serialize
".
Ho poi provato utilizzando il sovraccarico di GetMethod
che accetta un array di System.Type
per risolvere il binding:
GetMethod("Serialize", new[] { typeof(Stream), instance.GetType() })
Ma appena fatto il risultato di GetMethod
null
.
Come posso utilizzare la reflection per ottenere il MethodInfo
per void Serializer.Serialize<T>(Stream, T)
, dove T
è instance.GetType()
?
Considerate questa discussione http://stackoverflow.com/questions/4035719/getmethod-for-generic-method –
possibile du plicate di [Seleziona il metodo generico destro con Reflection] (http://stackoverflow.com/questions/3631547/select-right-generic-method-with-reflection) – nawfal
possibile duplicato di [Come utilizzare il reflection per chiamare il metodo generico?] (http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-generic-method) – usr