C#具有多种类型的泛型类型推理

C#具有多种类型的泛型类型推理,c#,.net,generics,C#,.net,Generics,我使用以下通用方法将一种类型的输入对象序列化为超级类型,如下所示: public string SerialiseAs<TResult, TInput>(TInput input) where TInput : TResult { DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(TResult)); MemoryStream stream = new MemoryStream

我使用以下通用方法将一种类型的输入对象序列化为超级类型,如下所示:

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);

为什么不这样写呢:

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();
}
publicstringserialiseas(TResult输入)
{
DataContractJsonSerializer ser=新的DataContractJsonSerializer(typeof(TResult));
MemoryStream stream=新的MemoryStream();
ser.WriteObject(流,输入);
流位置=0;
StreamReader=新的StreamReader(流);
返回reader.ReadToEnd();
}
由于
TInput
源于
TResult
,因此您根本不需要指定

我的问题是,为什么在这种情况下不能推断锡箔呢

它可以-它是无法推断的
TResult
,并且无法指定“部分”推断

有时,您可以将类型参数分为泛型类型的参数和泛型方法的参数,因此最终会得到:

// Explicitly state TResult, and infer TInput
Serializer<MySuperType>.Serialize(x);
//显式声明TResult,并推断TInput
Serializer.Serialize(x);

C++有多少?要是C#有(成员)typedef就好了。我喜欢。但是不,它不是那样工作的。这不适用于
DataContractJsonSerialiser
,因此我更改了方法以采用这两种类型。当您将实例作为
MySuperClass
传递时,
MySubType
中的任何额外属性都将从序列化结果中忽略。您也没有在输出中获得我需要的
\uu type
属性。您必须将实例作为子类型传递,但要让它作为超级类型序列化。@AdamRodger-这很奇怪。我看不出
DataContractJsonSerializer
如何确定传递给它的变量的类型。
WriteObject()
方法将简单的
对象
作为其参数。你确定吗?是的,绝对肯定。我还有一个
Serialise
方法,它不像上面的方法那样进行类型洗牌,并且使用相同的输入,它们都产生不同的输出。
\uuu type
属性丢失。@AdamRodger-对我来说就像一个符咒:你可能在对已知类型或其他东西施魔法吗?我对WCF不太熟悉,但它要求我先将这个奇怪的
KnownType
属性放在类A上,然后才能工作。它在异常消息中还提到了一个
DataContractResolver
。是的
MySuperType
是一个抽象类,包含许多实现子类(通过
KnownType
指定)。您需要自动添加
\u type
属性,以便在客户端进行反序列化。我不认为那个特别的细节是重要的,因为我有一个工作方法,只是对为什么我不能推断输入类型感兴趣。这只是我的单元测试中使用的一个小助手方法,所以我可以检查是否存在必需的属性,以及是否省略了非必需的默认属性等等,这就更有意义了。我喜欢在类级别指定输出类型,但却推断输入类型。然后我仍然可以对generic
Serialise
方法进行继承检查。我也可以尝试使用流畅的语法,如
Serialise(x).As()
,但对于我实际使用的语法来说,这可能有点复杂。@AdamRodger:这样做会很棘手,因为当您指定
TResult
秒时,您不能施加
TInput:TResult
约束。如果您不介意丢失编译时约束,那么这当然不是问题。标记为答案的实际原因是您不能部分指定泛型类型。
// Explicitly state TResult, and infer TInput
Serializer<MySuperType>.Serialize(x);