2012-10-11 183 views
0

我有一个类如下:泛型集合对象

public class RecipientEmailDetails 
{ 
    public string Name { get; set; } 
    public string Email { get; set; } 
    public List<VacancyEmailDetails> Vacancies { get; set; } 
} 

这个类需要改变,以允许空缺采取例如如下通用数据:

public class RecipientEmailDetails<T> 
{ 
    public string Name { get; set; } 
    public string Email { get; set; } 
    public List<T> Vacancies { get; set; } 
} 

不幸的是,目前如果我这样做,我需要改变这一切,实例化此类(这是很多,很多位置),包括这个新的泛型类型例如改变这个代码:

List<RecipientEmailDetails> recipientEmailDetails = wrapper.GetRecipientEmails(emailCount); 

要这样:

List<RecipientEmailDetails<VacancyEmailDetails> recipientEmailDetails = wrapper.GetRecipientEmails(emailCount); 

归根结底,这是一个很大的变化,许多这些当前位置将没有知识(理想情况下不应该有知识)的是什么类型的数据存储在空缺。他们只是简单地转发这些信息,直到最终确认并处理空缺职位清单。

无论如何切入追逐我正在寻找聪明的方法来将通用数据存储在空位中,而无需在任何地方改变RecipientEmailDetails对象的初始化方式。我宁愿不必装箱并取消它。

我要补充一点,VacancyEmailDetails目前是这样的:

public class VacancyEmailDetails 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public string Location { get; set; } 
    public string Salary { get; set; } 
    public string Notes { get; set; } 
} 

在所有情况下的空缺将rquired举行类似的与很少或几种方法这一个,即主要数据成员的对象。但是,这些成员的数量,名称和类型会有很大差异。

+4

一个很好的例子,为什么你应该尽可能多地使用'var'。如果已经用隐式键入 –

+0

@RuneFS声明变量,那么将不会更改metnioned代码:否,不应尽可能地使用'var'。通常你想让代码知道类型,并且如果一个接口改变了,代码不应该只是编译而且会产生意想不到的结果。 – Guffa

+0

在强类型语言imho中使用var并不是什么好的编程习惯,即使它把这个问题排除出来也很容易导致另外10个更严重的问题。 – kh25

回答

0

感谢您的回应。我决定对接口,而是重新定义了类此:

public class RecipientEmailDetails 
{   
    public string Name { get; set; } 
    public string Email { get; set; } 
    public List<Dictionary <string, string>> Vacancies { get; set; } 
} 

那么有唯一需要改变其中的几行像这样的:

new RecipientEmailDetails{ 
    Name = "Test1", 
    Email = "[email protected]", 
    Vacancies = vacancies.Select(z => new VacancyEmailDetails{ 
              Id = z.Id.ToString(), 
              Notes = z.Notes 
             }).ToList()}; 

对于这些:

new RecipientEmailDetails{ 
    Name = "Test1", 
    Email = "[email protected]",          
    Vacancies = vacancies.Select(z => new []{ 
new {Key = "Id", Value = z.Id.ToString()}, 
new {Key = "Notes", Value = z.Notes}}.ToDictionary(d => d.Key, d => d.Value)).ToList()}) 

这使我可以做我所要求的,只有在我填充并从中提取数据时才需要明确地关注空缺的内容RecipientE mailDetails被引用。

1

引入一个接口IRecipientEmailDetails,让你的类实现它并改变GetRecipientEmails方法返回这个接口。

public interface IRecipientEmailDetails {} 

而在你的类中的方法:

public IRecipientEmailDetails GetRecipientEmails(string emailCount) { } 

这种或那种方式,你必须改变你的代码。

1

你可以使用一个接口来定义什么是允许的,如:

public class RecipientEmailDetails 
{ 
    public string Name { get; set; } 
    public string Email { get; set; } 
    public List<ISomeCommonInterface> Vacancies { get; set; } 
} 

各阶级实现这一点。