Я не уверен, что вы просите.Похоже, вы хотите использовать подход JsonReader / JsonWriter, но не хотите вручную писать 20 000 назначений JSON-свойств (например, if (token.Value == "prop1") result.prop1 = token.Value
).Если это так, то вы можете сгенерировать исходный код, который делает то, что вы хотите, и включить результат в свой проект.Есть много способов сделать это.Вот один из способов:
using System;
using System.IO;
using System.Linq;
using System.Text;
namespace GetCustomAttribute
{
class MainClass
{
public static void Main(string[] args)
{
var sb = new StringBuilder();
sb.AppendLine(@"
namespace GetCustomAttribute
{
public static class PurchaseaOrderParser
{
public static void Parse(string jsonString, PurchaseOrder purchaseOrder)
{
var reader = new JsonTextReader(new StringReader(jsonString));
var currentProperty = string.Empty;
while (reader.Read())
{
if (reader.Value != null)
{
if (reader.TokenType == JsonToken.PropertyName)
currentProperty = reader.Value.ToString();");
var props = typeof(PurchaseOrder).GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(IdAttribute)));
foreach (var prop in typeof(PurchaseOrder).GetProperties())
{
var attribute = prop.GetCustomAttributes(typeof(IdAttribute), false).SingleOrDefault() as IdAttribute;
if (attribute != null)
{
var s = $"if (reader.TokenType == JsonToken.String && currentProperty == \"{attribute.Id}\") purchaseOrder.{prop.Name} = reader.Value.ToString();";
sb.AppendLine(s);
}
}
sb.Append("}}}}}}");
File.WriteAllText("PurchaseOrderParser.cs", sb.ToString());
}
}
class PurchaseOrder
{
[Id("id")]
public string Id { get; set; }
[Id("name")]
public string Name { get; set; }
}
class IdAttribute : Attribute
{
public string Id { get; set; }
public IdAttribute(string id) => Id = id;
}
}
, который выдает:
namespace GetCustomAttribute
{
public static class PurchaseaOrderParser
{
public static void Parse(string jsonString, PurchaseOrder purchaseOrder)
{
var reader = new JsonTextReader(new StringReader(jsonString));
var currentProperty = string.Empty;
while (reader.Read())
{
if (reader.Value != null)
{
if (reader.TokenType == JsonToken.PropertyName)
currentProperty = reader.Value.ToString();
if (reader.TokenType == JsonToken.String && currentProperty == "id") purchaseOrder.Id = reader.Value.ToString();
if (reader.TokenType == JsonToken.String && currentProperty == "name") purchaseOrder.Name = reader.Value.ToString();
}}}}}}
.NET также включает возможности генерации кода во время выполнения.Я не знаком с ними, но вы могли бы сделать вышеупомянутое во время выполнения, что бы гарантировать, что синтаксический анализатор не синхронизируется с классом PurchaseOrder
.