【问题标题】:How can I constrain the type assigned to a variable of type Type?如何约束分配给 Type 类型变量的类型?
【发布时间】:2014-01-04 01:52:01
【问题描述】:

[注:已编辑以包括创建 FollowUpEvent 集合的要求]

我正在编写一个日历系统。我有一个基本类型CalendarEvent,以及一个中等复杂的后代类型层次结构(AppointmentEventReminderEventAppointmentInOfficeEvent 等)。我还想创建一个模式结构,为每个事件指定应创建的后续事件列表:

public class FollowUpEvent
{
    public Type EventType { get; set; };
    public int OffsetDays { get; set; };
    public bool IsRequired { get; set; };
}

static List<FollowUpEvent> EventsToAdd = new FollowUpEvent()
{
   new FollowUpEvent() { EventType = typeof(ReminderEvent), OffsetDays = 7, IsRequired = true },
   new FollowUpEvent() { EventType = typeof(ReminderEvent), OffsetDays = 14, IsRequired = false }
 }

问题是 EventType 属性将接受 any 对象类型,我想装饰性地将其限制为 CalendarEvent 及其后代。我意识到我可以在 setter 中做到这一点,但理想情况下我想在属性声明中表达它。

这可能吗?

(我来自 Delphi 背景,我认为我正在寻找的内容相当于 MyType = class of CalendarEvent 声明。)

【问题讨论】:

  • 为什么不声明 public CalendarEvent EventType?
  • 将类设为泛型,其中 T : CalendarEvent,并将 EventType 的类型设置为 T。
  • @NWard 我认为 Lustig 不想指出实际事件。他只想存储事件的类型(另一方面我不知道为什么)
  • 因为后续系统是一个模式,它指示工作流组件构建适当的后续实例。
  • @Magus:我需要这些 (List&lt;FollowUpEvent&gt; FollowUpSpecs) 的列表,并且该列表对于 CalendarEvent 的后代将是多态的。如果我做List&lt;FollowUpEvent&lt;CalendarEvent&gt;&gt;,那会保存一个键入的后续事件列表(我认为这可能是一个解决方案)。

标签: c# types


【解决方案1】:

我认为以下内容没有意义,但如果您不想存储实际的 CalendarEvent 对象,它会起作用:

public class FollowUpEvent<T> where T: CalendarEvent
{
    public Type EventType { get 
                            {
                              return this.GetType().GetGenericArguments()[0]
                              // OR
                              // return typeof(T)
                            }
                          }
    public int OffsetDays { get; set; };
    public bool IsRequired { get; set; };
}

【讨论】:

  • 您可以将this.GetType().GetGenericArguments()[0] 替换为typeof(T)
  • 这让我参与其中(一直到我在原始问题中写的内容),但我不能创建一个静态的List&lt;FollowUpEvent&lt;CalendarEvent&gt;&gt; 初始化(例如)new FollowUpEvent&lt;ReminderEvent&gt;() {OffsetDays = 7, IsRequired = true}跨度>
  • 也许只是声明一个枚举来描述事件的类型可以是一个解决方案。
  • @LarryLustig: List&lt;T&gt; 不是,也不能是类型参数的协变。如果您可以切换到纯IEnumerable&lt;T&gt; 解决方案,那应该可以。或者,您需要为 FollowUpEvent&lt;T&gt; 类提取非泛型接口或基类。
  • @RichardDeeming:开始研究第一个建议。我绝对不想要一组特定于类型的 FollowUpEvent 类,那样会重复工作。
【解决方案2】:

拥有 BaseEvent 类型的 EventType,所有其他事件类型都可以从该类型继承,以便您可以限制接受的类型。

【讨论】:

  • 是的,这是我的问题——如何限制接受的类型。
猜你喜欢
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
相关资源
最近更新 更多