簡體   English   中英

使用通用接口類型作為接口參數類型的基礎

[英]using Generic interface type as basis for interface parameter type

我有以下內容:

class Item {
  public object ItemId {get;set;}
}

class StringItem : Item {
  public new string ItemId {get;set;}
}

interface IItemRepository<out T> : where T : Item {
  T GetItem(object itemId);
}

我想要的是能夠根據我正在使用的實現將ItemId替換為ItemId的類型。 我可以使用IItemRepository來實現它,其中U是ItemId類型,但我想將itemId類型直接綁定到ItemId屬性類型。 另外,我不一定要將IItemRepository用作接口。 我可以把它變成一個抽象類,但我也沒有看到一種簡單的方法來做到這一點。

所以,最終的結果是我能做到:

StringItemRepository : IItemRepository<StringItem> {
  StringItem GetItem(string itemId) { ... }
}

這將滿足接口。 有沒有辦法做這樣的事情:

T GetItem(typeof(T.ItemId.GetType()) itemId);

更新:我不能簡單地做IItemRepository,因為我將有多個Item的實現。 每個實現也將有一個存儲庫(可能是多個)。 所以,最終的WebService將具有以下內容:

IEnumerable<IItemRepository<Item>> Repositories;

此存儲庫列表將用於生成所有不同類型的項目。 我需要能夠區分Foo:Item和Bar:Item ...我可能只需要將ItemIdType傳遞給Repository,但它只是感覺笨重。 好像我在重復自己,應該有一些方法來重構這個,所以我沒有必要。

另一個更新...所以...這就是我開始提出的:

class Item<T> { 
  public T id {get;set;}
}

class StringItem : Item<string> {
  public string id {get;set;}
}

interface IItemRepo<T> {
  Item<T> GetItem(T id);
}

class StringItemRepository : IItemRepo<string> {
  public StringItem GetItem(string id) { return null}
}

問題是我需要StringItemRepository.GetItem來吐出StringItems,而不是Item對象。 我當前的實現不起作用因為StringItemRepository沒有實現GetItem因為它沒有返回Item ...你會認為因為StringItem是一個它可以工作的項目,但沒有這樣的運氣。

我想在創建存儲庫時我將不得不使用2種泛型類型(包括StringType和String),除非其他人有其他解決方案。

好的......所以,這有效:

class Item<T> { 
  public T id {get;set;}
}

class StringItem : Item<string> {
  public string id {get;set;}
}

interface IItemRepo<T> {
  Item<T> GetItem(T itemId);
}

class StringItemRepository : IItemRepo<string> {
  public Item<string> GetItem(string itemId) { 
    return new StringItem(); 
  }
}

我被掛起來讓GetItem有一個stringItem作為返回類型,但我可以返回一個StringItem,因為它類型為Item ...這將完美地運行...感謝所有幫助...

聽起來你應該讓Item開頭 - 然后你根本不需要StringItem ,它的屬性隱藏:

class Item<T> {
  public T ItemId { get; set; }
}

interface IItemRepository<T> {
  Item<T> GetItem(T itemId);
}

為什么不實現這個;

public class Item<T>
{
    public T ItemId { get; set; }
}

public class StringItem<T> : Item<T>
{

}

public interface IItemRepository<T>
{
    Item<T> GetItem(T itemId);
}

public class StringItemRepository<T> : IItemRepository<T>
{
    public Item<T> GetItem(T itemId)
    {
        throw new NotImplementedException();
    }
}

暫無
暫無

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

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