Ich verwende C# /. NET 4.0 und eine Protocol Buffers-Bibliothek (Protobuf-Net), die die folgende Funktionalität bietet.Verwenden von System.Type zum Aufrufen einer generischen Methode
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);
}
Ich muss mit Nicht-Generika zwei dieser Anrufe wickeln. Insbesondere möchte ich
void SerializeReflection(Stream destination, object instance);
object DeserializeReflection(Stream source, Type type);
, die einfach die jeweiligen Gattungs Mitglieder Serializer
zur Laufzeit aufrufen. Ich habe die DeserializeReflection
Methode bekommen mit dem folgenden Code zu arbeiten:
public static object DeserializeReflection(Stream stream, Type type)
{
return typeof(Serializer)
.GetMethod("Deserialize")
.MakeGenericMethod(type)
.Invoke(null, new object[] { stream });
}
Die SerializeReflection
Methode ist es, was mir Probleme verursacht. Ich versuchte zunächst, den folgenden Code:
public static void SerializeReflection(Stream stream, object instance)
{
typeof(Serializer)
.GetMethod("Serialize")
.MakeGenericMethod(instance.GetType())
.Invoke(null, new object[] { stream, instance });
}
Das Problem ist, dass der Teil zwischen typeof(Serializer)
und .Invoke(...)
funktioniert nicht. Der Aufruf an GetMethod("Serialize")
ruft mir eine AmbiguousMatchException
, weil es vier Methoden namens "Serialize
" gibt.
Ich habe dann versucht, die Überlastung von GetMethod
verwenden, das eine Reihe von System.Type
nimmt die Bindung zu lösen:
GetMethod("Serialize", new[] { typeof(Stream), instance.GetType() })
Aber dies machte nur das Ergebnis von GetMethod
null
.
Wie kann ich Reflektion verwenden die MethodInfo
für void Serializer.Serialize<T>(Stream, T)
zu bekommen, wo T
instance.GetType()
ist?
Betrachten dieses Themas http://stackoverflow.com/questions/4035719/getmethod-for-generic-method –
möglich du plicaate von [Wählen Sie rechts generische Methode mit Reflexion] (http://stackoverflow.com/questions/3631547/select-right-generic-method-with-reflection) – nawfal
mögliche Duplikate von [Wie Reflection verwenden, um generische Methode zu nennen?] (http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-generic-method) – usr