Сериализация в Json экземпляра интерфейса - C#
Формулировка задачи:
Есть два класса, которые были наследование от интерфейса и класс в котором объявлена переменная типа интерфейса от которого наследуются два предыдущих класса.
Сделано это было ля того, что бы можно было передавать разные по структуре классы классы.
Думаю суть и логику вы уловили, буду благодарен за любую инфу.
Естественно вылетает исключение которое пытается сказать что нельзя делать так с интерфейсами.
Вопрос: можно ли каким - то образом передавать разные классы через одну и ту же переменную?
interface SomeInterface { } class class1 : SomeInterface { public string str1; public string str2; public string str3; public string str4; } class class2 : SomeInterface { public int int1; public int int2; public int int3; public int int4; } class SomeClass { public string strInfo; public SomeInterface SomeInterface1; } private void Method1() { class1 cl = new class1{ str1 = "1", str1 = "2", str1 = "3", str1 = "4"}; SomeClass sc = new SomeClass { strInfo = "123", SomeInterface1 = cl }; string s = Newtonsoft.Json.JsonConvert.SerializeObject(sc); }
Это хотя бы возможно?
Решение задачи: «Сериализация в Json экземпляра интерфейса»
textual
Листинг программы
using System; using Newtonsoft.Json; namespace ConsoleApplication1 { public interface ISomeInterface<T1,T2,T3,T4> { T1 element1 { get; set; } T2 element2 { get; set; } T3 element3 { get; set; } T4 element4 { get; set; } void PrintType(); } public class BaseClassForSomeInterface<T1, T2, T3, T4> : ISomeInterface<T1, T2, T3, T4> { public T1 element1 { get; set; } public T2 element2 { get; set; } public T3 element3 { get; set; } public T4 element4 { get; set; } public virtual void PrintType() { Console.WriteLine($"this type class: {GetType()}"); } } public class Class1 : BaseClassForSomeInterface<string,string,string,string> { public override void PrintType() { Console.WriteLine("this type class: class1"); } } public class Class2 : BaseClassForSomeInterface<int,int,int,int> { public override void PrintType() { Console.WriteLine("this type class: class2"); } } public class SomeClass { public string strInfo; public ISomeInterface<string, string, string, string> ClassInstance1 { get; set; } public ISomeInterface<int, int, int, int> ClassInstance2 { get; set; } public void PrintType() { Console.WriteLine("this type class: SomeClass"); ClassInstance1.PrintType(); ClassInstance2.PrintType(); } } class Program { static void Main(string[] args) { var instance = new SomeClass { strInfo = "123", ClassInstance1 = new Class1 { element1 = "1", element2 = "2", element3 = "3", element4 = "4" }, ClassInstance2 = new Class2 { element1 = 1, element2 = 2, element3 = 3, element4 = 4 } }; PrintInstanceType(instance, "instance"); var jsonSerializerSettings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All }; var json1 = JsonConvert.SerializeObject(instance); var json2 = JsonConvert.SerializeObject(instance, jsonSerializerSettings); try { var jsonResult1 = JsonConvert.DeserializeObject<SomeClass>(json1); PrintInstanceType(jsonResult1, "jsonResult1"); } catch (Exception exception) { Console.WriteLine($"instance class: jsonResult1"); Console.WriteLine("Deserialization Exception!!!"); Console.WriteLine(); } var jsonResult2 = JsonConvert.DeserializeObject<SomeClass>(json2, jsonSerializerSettings); PrintInstanceType(jsonResult2, "jsonResult2"); Console.WriteLine("Press any key for exit..."); Console.ReadKey(true); } private static void PrintInstanceType(SomeClass instance, string name) { Console.WriteLine($"instance class: {name}"); instance.PrintType(); Console.WriteLine(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д