将对象格式化为主题和主体的通用方法
本文关键字:主体 方法 对象 格式化 | 更新日期: 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
例程。是否有任何通用的方法来编写这个,而不使用is
或as
操作符在所有的地方检查类型?
这就是接口的作用。从概念上讲,接口就像一个类可以签署的契约,类必须定义接口指定的方法。将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));
}
}
其他选项包括创建接口(如另一个答案所述,但如果您有一个对象列表,这将很难),以及创建扩展方法(对于对象列表也很难)。