【发布时间】:2016-10-16 10:48:31
【问题描述】:
我正在构建一个 Web 服务,它使用 '基本请求'
public class BaseRequest
{
public string Operation { get; set; }
public string SessionToken { get; set; }
protected dynamic Content { get; set; }
public bool IsEncrypted { get; set; }
public override string ToString()
{
return RestClient.GetSerializerNative().Serialize(this);
}
}
然后,当它进入我正在构建的每个功能的控制器时,我通过“as NewClassType”将其转换为我的专用类型。 但是,我似乎无法让强制转换在一个特定的控制器上工作,我不确定为什么不 - 因为相同的原理在代码的其他地方也适用。
“内容”字段是受保护的动态有两个原因。 根据正在执行的操作,动态内容可以是“任何东西”。 protected 是为了防止继承中的“不明确的名称/字段”异常。
所以我的代码: 我要在这里展示的特殊类型是
public class UploadImageRequest : BaseRequest
{
public new UIContent Content { get; set; }
}
public class UIContent
{
public string ImageName { get; set; }
public string ImageHash { get; set; }
public byte[] BinaryData { get; set; }
}
新关键字是用 UIContent 的定义“覆盖”或“替换”基类中的“内容”。 根据我的其他示例,它应该将动态更改为适当的类型。
那么在Execute方法中的实际实现:
case "uploadimage":
BaseRequest uploadImage
= Default.GetJSSerializerNative().Deserialize<BaseRequest>(originalContent);
_responseToDeliver =
operations.uploadimage.Controller.Execute(uploadImage).ToString();
break;
然后进入:
public static Response Execute(BaseRequest request)
{
Response r = new Response();
UploadImageRequest uir = request as UploadImageRequest;
string name, hash = "";
byte[] data = null;
if (uir != null)
{
name = uir.Content.ImageName;
hash = uir.Content.ImageHash;
data = uir.Content.BinaryData;
}
然而,uir 在强制转换后总是以 null 结束。
在另一个例子中,我有:
case "getshowdata":
ShowDataRequest showRequest
= Default.GetJSSerializerNative().Deserialize<ShowDataRequest>(originalContent);
_responseToDeliver =
operations.TvShowInfo.Controller.Execute(showRequest).ToString();
break;
ShowDataRequest 如下所示:
public class ShowDataRequest : BaseRequest
{
public new ShowDataContentModel Content { get; set; }
}
public class ShowDataContentModel
{
public string ShowName { get; set; }
}
在它的控制器中——它完美地工作。 那么我的 UploadImage 操作在这里发生了什么? 为什么不能从 BaseRequest 转换为专用类型,而 ShowDataRequest 可以。
注意:我尝试了各种方法。 case 语句将 BaseRequest 作为我目前为上传反序列化的类型,但我已尝试反序列化为中间类型和各种类型。
例如:
BaseRequest -> ImageRequest
ImageRequest 是两者的基类类型 UploadImageRequest 和 AcquireImageRequest
反序列化为 ImageRequest - 获取内容信息(我将其作为动态) 但是当我然后转换为 Upload 或 Acquire 时 - 整个类都变为空。
想法?
【问题讨论】:
标签: c# json inheritance casting deserialization