我有这样的类型:
class Foo<T>
{
public string Text { get; set; }
public T Nested { get; set; }
public static string ToJson(Foo<T> foo) { [...] }
}
ToJson
以Foo<Bar>
一种无法通过调整JsConfig
. 此外,ToJson
依赖 ServiceStack.Text 来序列化Nested
,它可以是Foo<Baz>
.
不幸的是,JsConfig
实现方式意味着将有一JsConfig<T>
组静态变量 forFoo<Bar>
和其他 for Foo<Baz>
。此外,AFAIK,ServiceStack.Text 无法为开放的泛型类型(即:类似的东西JsConfig.Add(typeof(Foo<>), config)
)配置 JSON 序列化。我试图通过创建这个静态构造函数来解决这个问题Foo<T>
:
static Foo() {
JsConfig<Foo<T>>.RawSerializeFn = ToJson;
}
这并不总是有效。这取决于运行时调用静态构造函数的顺序。显然,ServiceStack.Text 缓存了序列化程序函数,并且有时会在调用静态构造函数之前执行此操作,具体取决于 API 中调用操作的顺序,因此:
var outer = new Foo<Baz> { Text = "text" };
outer.ToJson(); // OK, because Nested is null
var inner = new Foo<Bar>();
inner.ToJson(); // OK, because JsConfig<Foo<Bar>>.RawSerializeFn is Foo<T>.ToJson
outer.Nested = inner;
outer.ToJson(); // NOT OK, because SS.Text uses the default serializer for Foo<T>, not Foo<T>.ToJson
我不能JsConfig<Foo<T>>
预先设置所有的序列化器,因为 T 几乎可以是任何类型,甚至是其他泛型类型。
是否可以在 ServiceStack.Text 中为开放的泛型类型(可以嵌套)定义自定义序列化例程?