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