18. Jsonのポリモフィズム
public abstract class JsonAbstract
{
public string TypeFullName { get; set; } = string.Empty;
protected JsonAbstract(string typeFullName)
=> TypeFullName = typeFullName;
}
public class TextFieldDesign : ValueFieldDesignBase
{
public TextFieldDesign() : base(typeof(TextFieldDesign).FullName!) { }
…
}
TypeFullNameを持っておく
public class FormDesign
{
public List<FieldDesignBase> Fields { get; set; } = new();
}
これをJsonに保存したい
19. public class JsonAbstractClassConverter<T> : JsonConverter<T> where T : JsonAbstract
{
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
using JsonDocument document = JsonDocument.ParseValue(ref reader);
if (!document.RootElement.TryGetProperty("TypeFullName", out JsonElement typeProperty) &&
!document.RootElement.TryGetProperty("typeFullName", out typeProperty))
throw new JsonException("TypeFullName property is missing.");
var typeFullName = typeProperty.GetString() ?? string.Empty;
var type = TypeFinder.GetType(typeFullName);
if (type == null || !typeof(T).IsAssignableFrom(type))
throw new JsonException($"Type {typeFullName} is not a valid {typeof(T)} type.");
var deserializeMethod = typeof(JsonSerializer).
GetMethod("Deserialize", new[] { typeof(JsonElement), typeof(JsonSerializerOptions) })!.MakeGenericMethod(type);
var obj = deserializeMethod.Invoke(null, new object[] { document.RootElement, options });
return (T)obj!;
}
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
=> JsonSerializer.Serialize(writer, (object)value, options);
}
Jsonのポリモフィズム
20. public static void AddJsonConverters(this IList<JsonConverter> Converters)
{
Converters.Add(new JsonAbstractClassConverter<JsonAbstract>());
foreach (var e in GetJsonAbstracts())
{
Converters.Add((JsonConverter)Activator.CreateInstance(typeof(JsonAbstractClassConverter<>).MakeGenericType(e))!);
}
}
static List<Type> GetJsonAbstracts()
{
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var fieldDesigns = new List<Type>();
foreach (var assembly in assemblies)
{
var types = assembly.GetTypes();
fieldDesigns.AddRange(types.Where(t => t.IsClass && !t.IsGenericType &&
t.IsAbstract && t.IsSubclassOf(typeof(JsonAbstract))));
}
return fieldDesigns;
}
Jsonのポリモフィズム
21. ClosedXmlとPDFSharp
フロントで動く
(System.Drawaing.Commonの依存がなくなってた)
var searchFile = new FormSearcher("TestFiles");
searchFile.AddEquals("Name.Value", "Quotation");
var file = searchFile.Execute()[0];
var excel = file.File.GetExcel();
excel.OverWrite(this);
excel.DownloadPdf();
フロントでスクリプト内で動いている
※でもフォント配布の問題とかあって
サーバーサイド実行に変えるかも