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);
}
これらの呼び出しのうちの2つを、一般的でない同等のものでラップする必要があります。具体的には
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(...)
ていないことです。「 。」という名前のメソッドが4つあるため、を呼び出すと、GetMethod("Serialize")
が取得されます。AmbiguousMatchException
Serialize
次に、そのオーバーロードを使用して、バインディングを解決するためにGetMethod
配列を使用してみました。System.Type
GetMethod("Serialize", new[] { typeof(Stream), instance.GetType() })
しかし、これはちょうどの結果になりGetMethod
null
ました。
MethodInfo
リフレクションを使用してforを取得するにはどうすればよいですかvoid Serializer.Serialize<T>(Stream, T)
、どこにT
ありinstance.GetType()
ますか?