我有以下通用接口
public interface ISerializer<T>
{
MemoryStream Serialize(IList<T> list);
MemoryStream Serialize(T obj);
}
当我按如下方式实现界面时
ISerializer<IList<BarcodeScannerModel>> Serializer = new Serializer<IList<BarcodeScannerModel>>();
var memstream = Serializer.Serialize(list);
object myObject = new object();
ISerializer<object> Serializer = new Serializer<object>();
var memStr = Serializer .Serialize(myObject);
两种实现都使用MemoryStream Serialize(T obj);
我的问题是为什么列表版本使用MemoryStream Serialize(T obj);
而不是Serialize(IList<T> list);
版本?
答案 0 :(得分:3)
您致电
的原因var memstream = Serializer.Serialize(list);
正在调用
MemoryStream Serialize(T obj);
当泛型被“填写”时,你的界面“看起来像”(伪代码):
public interface ISerializer<IList<BarcodeScannerModel>>
{
MemoryStream Serialize(IList<IList<BarcodeScannerModel>> list);
MemoryStream Serialize(IList<BarcodeScannerModel> obj);
}
所以在将IList<BarcodeScannerModel>
传递给Serialize()
时,它会正确选择obj
重载(请注意,这与正确的不相同)。
如果您想要打电话
MemoryStream Serialize(IList<T> list);
然后你需要定义你的serializer
:
ISerializer<BarcodeScannerModel> serializer = new Serializer<BarcodeScannerModel>();
基本上你正在加倍IList
s
答案 1 :(得分:0)
你试过吗
ISerializer<BarcodeScannerModel> Serializer = new ...
我的猜测是因为你的接口方法是为List<T>
定义的,同时你将List<Barcode...>
作为T
传递,你的实际参数不是预期的类型。