代码之家  ›  专栏  ›  技术社区  ›  griegs

根据泛型返回不同的列表

  •  0
  • griegs  · 技术社区  · 14 年前

    我以前问过这个问题,但我想我没有解释清楚,所以我要再试一次。

    我有下面的代码;

    public interface IDocumentMerger
    {
        List<???????> Process();
    }
    
    public class EmailMerger : IDocumentMerger
    {
        public void Process()
        {
            return new List<MailMessage>();
        }
    
    }
    
    public class DocumentMerger<T> where T : IDocumentMerger
    {
        public T objMerger;
    
        public DocumentMerger()
        {
            Type t = typeof(T);
            objMerger = (T)Activator.CreateInstance(t);
        }
    
        public List<???????> Process()
        {
            return objMerger.Process();
        }
    
    }
    

    我想用上面这样的东西;

    DocumentMerger<EmailMerger> merger = new DocumentMerger<EmailMerger>();
    List<MailMessage> messages = merger.Process();
    
    DocumentMerger<SmsMerger> merger = new DocumentMerger<SmsMerger>();
    List<SmsMessage> messages = merger.Process();
    

    但我不知道如何返回MailMessage类型的列表或SmsMessage类型的列表,这取决于我是创建一个documentmerge,还是MailMerger类型的列表。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Matt Mitchell    14 年前

    您的接口需要是通用的:

    public interface IDocumentMerger<DOCTYPE>
    {
      List<DOCTYPE> Process(); 
    } 
    

    然后类需要实现泛型接口:

    public class EmailMerger : IDocumentMerger<MailMessage>
    public class SMSMerger : IDocumentMerger<SmsMessage>
    

    我不知道你为什么要 DocumentMerger

    public class DocumentMerger<MERGERTYPE, DOCTYPE> where MERGERTYPE : IDocumentMerger<DOCTYPE>
    

    然后您的方法需要返回适当的类型:

    // In EmailMerger
    public List<MailMessage> Process()  
    
    // In SMSMerger
    public List<SmsMessage> Process()  
    
    // In DocumentMerger
    public List<DOCTYPE> Process()
    

    为什么不直接创建emailmerge/smsmsmerger实例呢,因为documentmerge只是一次包装其中一个实例(同样使用反射)?