Używam C#/.NET 4.0 i biblioteki buforów protokołu (protobuf-net), która zapewnia następujące funkcje.Korzystanie z System.Type w celu wywołania ogólnej metody
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);
}
muszę owinąć dwa z tych połączeń z odpowiednikami non-generycznych. W szczególności chcę
void SerializeReflection(Stream destination, object instance);
object DeserializeReflection(Stream source, Type type);
że po prostu zadzwonić do odpowiednich członków generyczne Serializer
przy starcie. Dostałem metodę DeserializeReflection
do pracy z następującego kodu:
public static object DeserializeReflection(Stream stream, Type type)
{
return typeof(Serializer)
.GetMethod("Deserialize")
.MakeGenericMethod(type)
.Invoke(null, new object[] { stream });
}
SerializeReflection
metody jest to, co jest przyczyną mnie kłopoty. I początkowo próbowali następujący kod:
public static void SerializeReflection(Stream stream, object instance)
{
typeof(Serializer)
.GetMethod("Serialize")
.MakeGenericMethod(instance.GetType())
.Invoke(null, new object[] { stream, instance });
}
Problem polega na tym, że część między typeof(Serializer)
i .Invoke(...)
nie działa. Połączenie z numerem GetMethod("Serialize")
powoduje, że otrzymuję numer AmbiguousMatchException
, ponieważ istnieją cztery metody o nazwie "Serialize
."
Następnie próbowałem przy użyciu przeciążenie GetMethod
że pobiera tablicę System.Type
rozwiązać wiązanie:
GetMethod("Serialize", new[] { typeof(Stream), instance.GetType() })
Ale to właśnie sprawiło, że wynik GetMethod
null
.
Jak mogę użyć refleksji uzyskać MethodInfo
dla void Serializer.Serialize<T>(Stream, T)
, gdzie T
jest instance.GetType()
?
Rozważmy ten wątek http://stackoverflow.com/questions/4035719/getmethod-for-generic-method –
możliwe du plicate z [Select Right Generic Method with Reflection] (http://stackoverflow.com/questions/3631547/select-right-generic-method-with-reflection) – nawfal
możliwy duplikat [Jak korzystać z odbicia, aby wywołać ogólną metodę?] (http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-generic-method) – usr