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

标签 c# generics enums

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

public enum EmailType { Welcome, Reminder }
这些类型有相应的模板和模型,例如 Welcome电子邮件有一个模板:
<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# 中的某些内容,或者我的整个概念都不好。我认为我处于死胡同,因为我认为我不能从一个方法返回两个单独的强类型类。
是否可以根据枚举输入返回通用模型?

最佳答案

Is it possible to return generic class based on enum input?


不。不是以对调用者有用的方式。
您的方法返回 ITemplate<T> .但是T必须在编译时定义为某些东西。您不能将定义推迟到运行时,除非使用后期绑定(bind)(即 dynamic )或非类型安全机制(这否定了使用泛型的全部意义)。
可能如果您可以重新构建您的问题并解释为什么您认为调用返回开放泛型类型的方法是合理的 ITemplate<T>调用站点不了解类型参数 T实际上,可以找到一个有用的解决方案。
但正如您迄今为止在您的问题中所述,唯一真正的答案是,不,那是行不通的,如果可以的话,也没有任何意义。

关于c# - 是否可以根据枚举输入返回泛型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63945436/

相关文章:

c# - 在 c# (Vsto) 的 Excel 2007 中保存 Excel 模板 2003 时出现问题

.net - 为什么.NET中没有通用的同步队列?

Java枚举反向查找

swift - 枚举关联值和泛型

c# - 没有从 ApplicationUser 到 IdentityUser 的隐式引用转换

c# - 将枚举中的下划线替换为 DisplayFor 帮助程序中的空格

c# - 在 NHibernate 中动态引用属性?

c# - 如何构建一个健壮/可扩展的异步等待回显服务器?

c# - 解耦类 C#

Java泛型类和非泛型类