将对象格式化为主题和主体的通用方法

本文关键字:主体 方法 对象 格式化 | 更新日期: 2023-09-27 18:04:00

我正在尝试将对象列表和格式这些作为电子邮件主题和正文。为了说明我在做什么,请使用以下示例:

public string GetSubject(Person myPerson) 
{ 
    return String.Format("To {0}", myPerson.Name); 
}
public string GetMessage(Person myPerson) 
{ 
    return String.Format("Dear {0}, Your new salary: {1}", 
        myPerson.Name, myPerson.Salary); 
}
public string GetSubject(VacationDay dayOff) 
{ 
    return String.Format("Vacation reminder!"); 
}
public string GetMessage(VacationDay dayOff) 
{ 
    return String.Format("Reminder: this {0} is a vacation day!", dayOff.Name); 
}

之后我有一堆邮件想要批量发送:

// myEmailObjects is a "List<object>"
foreach (var emailItem in myEmailObjects)
{
    SendEmail(from, to, GetSubject(emailItem), GetMessage(emailItem));
}

问题是这段代码无法编译,因为编译器无法解析调用哪个GetSubject和哪个GetMessage例程。是否有任何通用的方法来编写这个,而不使用isas操作符在所有的地方检查类型?

将对象格式化为主题和主体的通用方法

这就是接口的作用。从概念上讲,接口就像一个类可以签署的契约,类必须定义接口指定的方法。将GetSubject()GetMessage()方法定义为相应类的成员方法,然后创建以下接口:

public interface IEmailable {
    string GetSubject();
    string GetMessage();
}

然后,让所有相关的类实现接口:

public class VacationDay : IEmailable

您现在可以创建一个List<IEmailable>(),并且您可以在其元素上调用这两个方法。

假设您保留了List<object>,最简单的事情是检查迭代器变量的类型,然后选择执行哪个操作。

foreach (var emailItem in myEmailObjects)
{
    if (emailItem is Person)
    {
        SendEmail(from, to, GetSubject((Person)emailItem), 
            GetMessage((Person)emailItem));
    }
    else if (emailItem is VacationDay)
    {
        SendEmail(from, to, GetSubject((VacationDay)emailItem), 
            GetMessage((VacationDay)emailItem));
    }
}

其他选项包括创建接口(如另一个答案所述,但如果您有一个对象列表,这将很难),以及创建扩展方法(对于对象列表也很难)。