簡體   English   中英

通用接口實現 - 執行順序

[英]Generic interface implementation - order of execution

我有以下通用接口

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); 版?

你打電話的原因

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

你有沒有嘗試過

ISerializer<BarcodeScannerModel> Serializer = new ...

我的猜測是因為您的接口方法是為List<T>定義的,同時您將List<Barcode...>作為T傳遞,您的實際參數不是預期的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM