【发布时间】:2020-09-17 19:59:47
【问题描述】:
我正在编写一个小型电子邮件模板引擎,使用 Razor 语法来填充标记。我有几种电子邮件类型:
public enum EmailType { Welcome, Reminder }
这些类型都有对应的模板和模型,例如Welcome email 有一个模板:
<p>Welcome, @Model.Name</p>
以及相应的模型:
public class WelcomeModel { public string Name { get; set; } }
现在我想创建一个方法,为给定的枚举强制一个正确的模型,我想像这样:
public ITemplate<T> GenerateTemplate(EmailType emailType)
{
switch (emailType)
{
case EmailType.Welcome:
return new EmailTemplate<WelcomeModel>();
case EmailType.Reminder:
return new EmailTemplate<ReminderModel>();
// ...
}
EmailTemplate<T> : ITemplate<T>,所以我可以链接方法:
engine
.GenerateTemplate(EmailType.Welcome)
.WithModel(new WelcomeModel()) // this knows it wants WelcomeModel
// and should complain with compiler error otherwise
我在此处显示的代码无法编译,因为 T 未知。但是无法推断出这个T:
public ITemplate<T> GenerateTemplate<T>(EmailType emailType)
这给我留下了:
engine
.GenerateTemplate<WelcomeModel>(EmailType.Welcome)
.WithModel(new WelcomeModel());
这行得通,但我觉得我在传递冗余信息 - 枚举和模型,而你可以从另一个中推断出一个。我不确定我是否遗漏了 C# 中的某些内容,或者我的整个概念都不好。我认为我走入了死胡同,因为我认为我不能从一个方法返回两个单独的强类型类。
是否可以根据枚举输入返回通用模型?
【问题讨论】:
-
WithModel也是通用的吗?试着让它WithModel<T>(T model) -
我可以将
WithModel设为通用,但这样它会接受任何模型——不是我想要强制的模型 -
基于枚举?我认为你不能在不创造一些奇怪的反射的情况下做到这一点,即使那样也可能不行。也许您可以使用分析器来强制开发人员。但是,您需要一种将枚举值映射到模型的方法。