1

シリアル化できる汎用クラスがあります。

MyOwnGenericClass<T>

だから私はそれを逆シリアル化したいのですTが、Stringインスタンスがそれを処理する場合、別の場合には例外をスローしたいと思います。デシリアライズ中

にジェネリックのタイプが含まれていることを知る方法は?MyOwnGenericClass<T>次のコードをどのクラスにキャストする必要がありますか?

new BinaryFormatter().Deserialize(fileStrieam);
4

3 に答える 3

4

それは本当に簡単です。object次のように使用します。

object obj = new BinaryFormatter().Deserialize(fileStrieam);

そして、あなたがすると言ったことをします:

if (!(obj is MyOwnGenericClass<string>))
    throw new Exception("It was something other than MyOwnGenericClass<string>");
else {
    MyOwnGenericClass<string> asMyOwn_OfString = obj as MyOwnGenericClass<string>;

    // do specific stuff with it
    asMyOwn.SpecificStuff();
}

Tしたがって、が であるかどうかを確認していませんstring。それ以上のことをチェックしています: obj が であるかどうかをチェックしていますMyOwnGenericClass< string >。誰もそれが常にあるとは言いませんでしたがMyOwnGenericClass< something >、私たちの唯一の頭痛の種は、それが何であるかを見つけることです.

bool、文字列、int、int のプリミティブ配列、さらにはStringBuilder. そして、あなたの側近があります: あなたは , を送ることができますMyOwnGenericClass< int >(MyOwnGenericClass< string >そして、これはあなたが受け入れる唯一のものです)。

于 2013-02-27T17:22:26.883 に答える
1
var test = new MyGenericType<string>();

var genericTypes = test.GetType().GetGenericArguments();
if (genericTypes.Length == 1 && genericTypes[0] == typeof(string))
{
    // Do deserialization
}
else
{
    throw new Exception();
}
于 2013-02-27T17:15:04.320 に答える
1

Type.GetGenericArguments()実行時に型が作成されたジェネリック引数の実際の値を取得するために使用できます。

class MyGeneric<TValue> {}

object stringValue = new MyGeneric<string>();
object intValue = new MyGeneric<int>();

// prints True
Console.WriteLine(stringValue.GetType().GetGenericArguments()[0] == typeof(string));
// prints False
Console.WriteLine(intValue.GetType().GetGenericArguments()[0] == typeof(string));
于 2013-02-27T17:15:29.517 に答える