通用集合对象

时间:2012-10-11 12:09:10

标签: .net c#-4.0 generics

我有一个课程如下:

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

最终,这是一个很大的变化,许多当前的位置将不知道(并且理想情况下应该不知道)Vaconcies中存储的数据类型。他们将简单地转发此信息,直到最终检查和处理空缺列表。

无论如何切入追逐我正在寻找在Vaconcies中存储通用数据的巧妙方法,而无需在任何地方更改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; }
}

在所有情况下,空缺将被要求保留与此类似的对象,即主要是数据成员的方法很少或很少。但是,这些成员的数量,名称和类型会有很大差异。

3 个答案:

答案 0 :(得分:1)

引入接口IRecipientEmailDetails,让您的类实现它并更改GetRecipientEmails方法以返回此接口。

public interface IRecipientEmailDetails {}

你班上的方法:

public IRecipientEmailDetails GetRecipientEmails(string emailCount) { } 

无论如何,您都必须更改代码。

答案 1 :(得分:1)

您可以使用界面来定义允许的内容,例如:

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

所有课程都实现了这一点。

答案 2 :(得分: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 = "Test@hotmail.com",
    Vacancies = vacancies.Select(z => new VacancyEmailDetails{
                                           Id = z.Id.ToString(),
                                           Notes = z.Notes
                                       }).ToList()};

对于这些:

new RecipientEmailDetails{
    Name = "Test1",
    Email = "Test@hotmail.com",                                       
    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()})

这使我能够按照我的要求行事,只需要在填充和提取数据时明确关注职位空缺的内容,而不是引用RecipientEmailDetails。