您的问题似乎非常广泛,并邀请人们为您提供现成的解决方案。我不会那样做,但我可以给你一些关于解决 3 vs 4 问题的提示
下面是一些将任意类型的对象读入键值对集合的基本代码:
void Main()
{
var reader = CreateReader(typeof(Foo));
reader(new Foo { Bar = "BARRRRR", Baz = 123 }).Dump();
}
public class Foo
{
public string Bar {get; set;}
public int Baz {get; set;}
}
static ConstructorInfo Ctor = typeof(KeyValuePair<string, object>).GetConstructor(new Type[] { typeof(String), typeof(Object) });
static Func<object, IEnumerable<KeyValuePair<string, object>>> CreateReader(Type t)
{
var prm = Expression.Parameter(typeof(Object), "prm");
var obj = Expression.Variable(t, "obj");
var arr = new List<Expression>();
foreach (var p in t.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
arr.Add(Expression.New(Ctor, Expression.Constant(p.Name), Expression.Convert(Expression.Property(obj, p), typeof(Object))));
}
var body = Expression.Block(
typeof(IEnumerable<KeyValuePair<string, object>>),
new ParameterExpression[] { obj },
Expression.Assign(obj, Expression.Convert(prm, t)),
Expression.NewArrayInit(typeof(KeyValuePair<string, object>), arr)
);
return Expression.Lambda<Func<object, IEnumerable<KeyValuePair<string, object>>>>(body, prm).Compile();
}
这允许您创建一个阅读器委托,它与任何静态编译的代码一样快速和高效。这应该给你足够的方向,让它去做你想做的任何事情。
接下来的步骤将是创建所有管道:
- 递归遍历您尝试序列化的对象树
- 创建和/或缓存读取器
- 读取键值对并将其写入 JSON。
这些都是您应该自己处理的琐碎任务。 JSON 规范在 http://json.org/ 公开提供
祝你好运。