Сериализация в 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();
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5