是否可以根据枚举输入返回泛型类?

tro*_*een 5 c# generics enums

我正在使用 Razor 语法编写一个小型电子邮件模板引擎来填充令牌。我有几种电子邮件类型:

public enum EmailType { Welcome, Reminder }
Run Code Online (Sandbox Code Playgroud)

这些类型有相应的模板和模型,例如Welcome电子邮件有一个模板:

<p>Welcome, @Model.Name</p>
Run Code Online (Sandbox Code Playgroud)

和相应的模型:

public class WelcomeModel { public string Name { get; set; } }
Run Code Online (Sandbox Code Playgroud)

现在我想创建一个方法来为给定的枚举强制一个正确的模型,我会想象这样的事情:

public ITemplate<T> GenerateTemplate(EmailType emailType)
{
    switch (emailType)
    {
        case EmailType.Welcome:
            return new EmailTemplate<WelcomeModel>();

        case EmailType.Reminder:
            return new EmailTemplate<ReminderModel>();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

where EmailTemplate<T> : ITemplate<T>,那么我可以链接该方法:

engine
    .GenerateTemplate(EmailType.Welcome)
    .WithModel(new WelcomeModel()) // this knows it wants WelcomeModel
                                   // and should complain with compiler error otherwise
Run Code Online (Sandbox Code Playgroud)

我在此处显示的代码无法编译,因为T未知。然而,这T不能推断:

public ITemplate<T> GenerateTemplate<T>(EmailType emailType)
Run Code Online (Sandbox Code Playgroud)

这让我有:

engine
    .GenerateTemplate<WelcomeModel>(EmailType.Welcome)
    .WithModel(new WelcomeModel());
Run Code Online (Sandbox Code Playgroud)

这有效,但我觉得我传递了冗余信息 - 枚举和模型,而您可以从另一个中推断出一个。我不确定我是否遗漏了 C# 中的某些内容,或者我的整个概念都不好。我认为我陷入了死胡同,因为我认为我无法从一种方法返回两个单独的强类型类。

是否可以根据枚举输入返回通用模型?

Pet*_*iho 3

是否可以根据枚举输入返回泛型类?

不,不是以对调用者有用的方式。

你的方法返回ITemplate<T>. 但T必须在编译时定义为某些内容。您不能将定义推迟到运行时,除非使用后期绑定(即dynamic)或非类型安全机制(这否定了使用泛型的全部意义)。

如果您可以重新构建您的问题并解释为什么您认为调用返回开放泛型类型的方法是合理的,而ITemplate<T>调用站点不了解类型参数T实际上是什么,则可以找到一个有用的解决方案。

但正如您到目前为止的问题所述,唯一真正的答案是,不,这行不通,而且如果可以的话也没有任何意义。