我正在使用自动生成的代码类,其中每个类
Foo
都有一个等效的 FooSerializer
类,具有静态 Serialize(Foo data)
方法。
我想编写一个辅助函数,它可以通过接收两个类型参数来为任何此类类执行 Serialize 方法(+一堆其他东西)。
public void Serialize<Foo, FooSerializer>(Foo data)
{
FooSerializer.Serialize(data);
}
但是这是行不通的,因为它不知道
FooSerializer
有 Serialize
方法,并且 FooSerializer
不派生自任何基于 Foo
定义该方法的通用接口。
有没有办法在通用约束中指定
FooSerializer
必须有一个接收Serialize
类型参数的Foo
方法?
在 C++ 中,我通过简单地将
Foo
和 FooSerializer
作为模板参数来实现这一点。不知道c#中是否有类似的解决方案。
在现代运行时(不是 .NET Framework 等),是的:
interface IFooSerializer<T>
{
// pick your own API here; string, byte[], Stream, etc
static abstract T Read(string value);
static abstract string Write(T value);
}
class Consumer
{
public void Serialize<Foo, FooSerializer>(Foo data)
where FooSerializer : IFooSerializer<Foo>
{
var s = FooSerializer.Write(data);
var clone = FooSerializer.Read(s);
}
}
但是,仅使用实例序列化程序可能会更容易。