gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:47:59 26 4
gpt4 key购买 nike

我正在编写一个使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com