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 のタイプに置き換えることができることです。U が ItemId タイプである IItemRepository を使用してそれを行うことができますが、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}
}

問題は、Item オブジェクトではなく、StringItems を吐き出すために StringItemRepository.GetItem が必要なことです。そして、私の現在の実装は機能しません.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(); 
  }
}

戻り値の型として stringItem を持つ GetItem を持つことにハングアップしましたが、型が Item であるため StringItem を返すことができます...これは完全に機能します...助けてくれたすべてに感謝します..

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 に答える