2

私は次の非常に単純な(要約された)クラスを持っています:

// IEntry interface
public interface IEntry {
  long Id { get; set; }
  string Name { get; set; }
}

// IEntry implementation 
public class Contact : IEntry {
  public long Id { get; set; }
  public string Name { get; set; }
}

// DAO Interface
public interface IEntryDao {
  List<IEntry> findUnapproved();
}

// abstract base class 
public abstract class AbstractEntryDao : IEntryDao {
  public virtual List<IEntry> findUnapproved() {
    List<IEntry> entries = new List<IEntry>();
    // ... default load logic
    return entries;
  }
}

// ContactDao implementation 
public class ContactDao : AbstractEntryDao { 
  public override List<IEntry> findUnapproved() {
     List<IEntry> contacts = new List<IEntry>();
     // ... custom load logic for Contact
     return contacts;
  }
}

// sample client code
public void testFindUnapproved() {
  ContactDao contactDao = new ContactDao();
  List<IEntry> contacts = contactDao.findUnapproved(); // <--- this line works (but not what I want) 
  List<Contact> contacts = contactDao.findUnapproved(); // <--- this does not work (which makes sense)
  List<Contact> contacts = contactDao.findUnapproved() as List<Contact>; // <--- this does not work

  // here is how i compensate for this problem... but i do not like this
  List<Contact> list = new List<Contact>();
  foreach (IManageableEntry contact in contacts) {
      list.Add(contact as Contact);
  }
}

私が欲しいのは、非常に簡単な方法です(または、Daoインターフェイスと抽象クラスでジェネリックを使用する可能性があります)

List<Contact> contacts = contactDao.findUnapproved(); // <--- can I achieve this using generics in .NET 3.5?

それ以外の場合、サンプルクライアントコードの最後以外に、不適切な方法であると思われるクリーンな代替ソリューションは何ですか?

4

2 に答える 2

4
List<Contact> contacts = contactDao.findUnapproved().Cast<Contact>().ToList();

ファイルの上にlinq名前空間を使用して追加することを忘れないでください

于 2012-11-29T23:45:26.497 に答える
2

の異なる実装を返す可能性があり、リストからのみ取得したい場合は、 Enumerable.OfTypeメソッドの使用を検討してください。findUnapprovedIEntryContact

List<Contact> contacts = contactDao.findUnapproved().OfType<Contact>().ToList();

OfType(およびCast)戻る限り、必要なものを入手するIEnumerable<T>ために電話する必要があります。ToList

于 2012-11-29T23:49:17.240 に答える