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 回答