4

次のように、あるタイプの入力オブジェクトをスーパータイプとしてシリアル化するための次のジェネリックメソッドがあります。

public string SerialiseAs<TResult, TInput>(TInput input) where TInput : TResult
{
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(TResult));
    MemoryStream stream = new MemoryStream();
    ser.WriteObject(stream, input);
    stream.Position = 0;
    StreamReader reader = new StreamReader(stream);
    return reader.ReadToEnd();
}

次のように両方のジェネリック型を指定してこのメ​​ソッドを呼び出す必要があります。

MySubType x = new MySubType();
string json = SerialiseAs<MySuperType, MySubType>(x);

私の質問は、なぜTInputこの状況で推測できないのですか?TResult実際にリターンタイプとして使用されていないからですか?次のコードはよりクリーンですが、入力タイプがないためにコンパイルされません。

MySubType x = new MySubType();
string json = SerialiseAs<MySuperType>(x);
4

2 に答える 2

7

次のように書いてみませんか。

public string SerialiseAs<TResult>(TResult input)
{
    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(TResult));
    MemoryStream stream = new MemoryStream();
    ser.WriteObject(stream, input);
    stream.Position = 0;
    StreamReader reader = new StreamReader(stream);
    return reader.ReadToEnd();
}

からTInput派生しているのでTResult、実際にはまったく指定する必要はありません。

于 2012-05-23T12:09:11.510 に答える
7

私の質問は、なぜこの状況でTInputを推測できないのですか?

それは可能です-それはTResult推論することができず、「部分的な」推論を指定する方法はありません。

時々できることは、型パラメーターをジェネリック用のものとジェネリックメソッド用のものに分けることです。そのため、最終的には次のようになります。

// Explicitly state TResult, and infer TInput
Serializer<MySuperType>.Serialize(x);
于 2012-05-23T12:10:22.180 に答える