[英]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.