2010-07-26 5 views
0

J'ai déjà posé cette question mais je ne pense pas que je me suis clairement expliqué, donc je vais essayer à nouveau.Renvoyer une liste différente selon le générique

J'ai le code ci-dessous;

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(); 
    } 

} 

Je veux utiliser ce qui précède comme ceci;

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

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

Mais je ne peux pas comprendre comment retourner soit une liste de type MailMessage ou une liste de type SmsMessage selon que je crée un DocumentMerger passage int soit MailMerger ou SmsMerger.

Répondre

4

Votre Interface doit être générique:

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

Ensuite, vos classes doivent implémenter l'interface générique:

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

Je ne sais pas pourquoi vous avez une classe DocumentMerger aussi bien mais serait comme ceci:

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

Et puis vos méthodes doivent retourner les types appropriés:

// In EmailMerger 
public List<MailMessage> Process() 

// In SMSMerger 
public List<SmsMessage> Process() 

// In DocumentMerger 
public List<DOCTYPE> Process() 

Pourquoi ne pas vous venez de faire des instances EmailMerger/SMSMerger si, comme DocumentMerger est enveloppait juste un de ceux-ci à la fois (en utilisant la réflexion non moins)?

+0

Je voulais créer un type d'usine pour que vous appeliez un seul objet et que vous changiez simplement le type et donc le type retourné. le but était de faciliter la tâche des autres utilisateurs – griegs

+0

Comment faciliter une nouvelle usine par type plutôt que de créer un type? –

Questions connexes