1

我有以下内容:

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 传递给存储库,但感觉很笨拙。好像我在重复自己,应该有一些方法来重构它,所以我不必这样做。

另一个更新......所以......这是我开始想出的:

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 是 Item 它可以工作,但没有这样的运气。

我想我必须在创建存储库时使用 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 类型的......这将完美地解决......感谢所有帮助......

4

2 回答 2

3

听起来你应该Item从通用开始 - 然后你根本不需要StringItem,它的属性隐藏:

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

interface IItemRepository<T> {
  Item<T> GetItem(T itemId);
}
于 2012-05-16T14:35:34.177 回答
0

为什么不实现这样的;

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();
    }
}
于 2012-05-16T14:39:43.513 回答