2010-07-26 55 views
2

这可能不是措辞相当正确的,但在这里不用反正。一般代理

如果我有以下陈述;

DocumentMerger<EmailMerge> mailMerge = new DocumentMerger<EmailMerge>(); 
List<MailMessage> mailMessages = mailMerge.Process(); 

DocumentMerger<SmsMerge> mailMerge = new DocumentMerger<SmsMerge>(); 
List<SmsMessage> smsMessages = mailMerge.Process(); 

我怎样才能创建一个通用类,需要一个类型为通用如EmailMerge返回MAILMESSAGE两种或SmsMessage对象的列表?

我有一个名为DocumentMerger的类,它创建我的对象EmailMerge或SmsMerge。

我现在需要他们两个,露出它返回的对象,如List<MaileMessage>List<SmsMessage>

自己独特的列表的处理方法,我怀疑的代理可能是这里的去,但不能工作的代码。

如果您认为不够清楚,请重新标题这个问题。

回答

1

的接口可以解决你的问题..

public interface IDocumentMerger 
{ 
} 

public interface IOutputType 
{ 
} 

public class MailMessage : IOutputType 
{ 
} 

public class EmailMerge : IDocumentMerger 
{ 
} 

public class SmsMerge : IDocumentMerger 
{ 
} 

public class DocumentMerger<T> where T : IDocumentMerger 
{ 
    public List<IOutputType> Process() 
    { 
     IOutputType result = null; 

     if (typeof(T) == EmailMerge) 
     { 
      result = new MailMessage(); 
     } 

     // etc.. 
     // do stuff.. 

     return result; 
    } 
} 

你会使用这样的:

var documentMerger = new DocumentMerger<EmailMerge>(); 

var emailMerge = documentMerger.Process(); 

emailMerge是List<MailMessage>类型的...

我希望我理解你的问题正确..代码是未经测试,但应该是正确的。还是真正接近它:)

伊恩

编辑 - 看起来像我误解您的要求..这是一个简单的修复,但请参阅编辑。

+1

您可以扩展这个解决方案有一个适当的工厂模式,通过简单地添加其他制造工厂类。这可以避免您的调用类中的一些开关情况和条件。 Ref:http://msdn.microsoft.com/en-us/library/ee817667.aspx – 2010-07-26 01:56:11

+0

我不是很了解IOutputType是什么,因为我得到了一个转换错误result = new MailMessage();对不起,我在这里错过了什么? – griegs 2010-07-26 02:54:43

+0

griegs -MailMessage应该实现IOutputType接口。 – 2010-07-26 12:09:21