【发布时间】:2017-09-01 15:35:35
【问题描述】:
我不确定是否有更好的方法来做到这一点。也许有人帮忙?
我想将JObject 类型的对象转换为工厂中的一个类。类本身应该根据另一个参数来决定。但我只能想到将对象序列化为字符串,然后再序列化回特定的类。一定有更好的方法吗?
https://dotnetfiddle.net/3Qwq6V
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
namespace Test
{
public class Input
{
public int TypeId { get; set; }
public object ObjectDefinesInput;
}
public class VoiceInput
{
public string Language;
}
public class TextInput
{
public string Encoding;
}
public interface IResponse
{
void Respond();
}
public class VoiceResponse : IResponse
{
private VoiceInput input { get; set; }
public VoiceResponse(VoiceInput input) { this.input = input; }
public void Respond()
{
// use information on VoiceInput to do something
Console.WriteLine("(In "+ this.input.Language +"): beep buup boop.");
}
}
public class TextResponse : IResponse
{
private TextInput input { get; set; }
public TextResponse(TextInput input) { this.input = input; }
public void Respond()
{
Console.WriteLine("I am a text handler. Using "+ this.input.Encoding +".");
}
}
public static class ResponseFactory
{
public static IResponse CreateResponseHandler(Input input)
{
// ----------------- ISSUE HERE -----------------------------//
// I'm using JsonConvert to serialize an <object> to a string, and then
string jsonObjectDefinesInput = JsonConvert.SerializeObject(input.ObjectDefinesInput, new JsonSerializerSettings
{
Formatting = Formatting.Indented,
ContractResolver = new CamelCasePropertyNamesContractResolver()
});
switch (input.TypeId)
{
case 1:
// (VoiceInput) input.ObjectDefinesInput throws exception
// input.ObjectDefinesInput as VoiceInput returns null
VoiceInput voiceInput = JsonConvert.DeserializeObject<VoiceInput>(jsonObjectDefinesInput);
return new VoiceResponse(voiceInput);
default:
TextInput textInput = JsonConvert.DeserializeObject<TextInput>(jsonObjectDefinesInput);
return new TextResponse(textInput);
}
}
}
public class Program
{
public static void Main(string[] args)
{
string jsonData1 = "{ \"typeId\": 1, \"ObjectDefinesInput\": { \"Language\": \"Robot\" } }";
string jsonData2 = "{ \"typeId\": 2, \"ObjectDefinesInput\": { \"Encoding\": \"UTF-8\" } }";
Input someInpput1 = JsonConvert.DeserializeObject<Input>(jsonData1);
Input someInpput2 = JsonConvert.DeserializeObject<Input>(jsonData2);
IResponse testResponse1 = ResponseFactory.CreateResponseHandler(someInpput1);
IResponse testResponse2 = ResponseFactory.CreateResponseHandler(someInpput2);
testResponse1.Respond();
testResponse2.Respond();
Console.ReadLine();
}
}
}
【问题讨论】:
-
请提供此问题中的代码,因此如果有人在 3 年内查看您的问题,也会看到属于它的代码。外部资源可能会被多次删除。
-
@TobiasTheel 好点。完成。
-
任意对象
o的运行时类型可以通过调用o.GetType()来确定。 -
你为什么在
CreateResponseHandler中序列化和反序列化input?那里的目标是什么?你从input.GetType()得到什么?你是说你只想要case 1: return new VoiceResponse((VoiceInput)input);? -
我猜测了一下,因为我对
input.ObjectDefinesInput是什么只有一个微不足道的推断。
标签: c#