【问题标题】:Action dictionary to expect type of it's key动作字典期望它的关键类型
【发布时间】:2014-11-20 06:24:19
【问题描述】:

目前,我有一个具有此签名属性的抽象类:

protected virtual IDictionary<Type, Action<object>> InitializationMap
{
    get
    {
        return null;
    }
}

一旦扩展,我会覆盖它,例如,像这样:

protected override IDictionary<Type, Action<object>> InitializationMap
{
    get
    {
        return new Dictionary<Type, Action<object>>
        {
            { typeof(INewSchoolWizardExtension), o => ((INewSchoolWizardExtension)o).InitializeWizard(this) },
            { typeof(INewSchoolProcessExtension), o => ((INewSchoolProcessExtension)o).Start() }
        };
    }
}

虽然它有效,但我真的不喜欢铸造部分,它确实使代码膨胀。

我在这里要做的是 - 为类型定义一个初始化映射。可以这么说,一旦它们稍后被解决,我会检查正在解决的类型并调用初始化程序。

我想用泛型来做这件事,但没有成功。

我如何实现行为,以便Action 始终期望它的键类型?

【问题讨论】:

  • 只是出于好奇-您的财产是virtual,似乎没有有意义的实现。为什么不改成abstract
  • @decPL,因为 abstract 是强制性的,并不是所有的类都需要它。

标签: c# generics types callback type-hinting


【解决方案1】:

这会带来轻微的开销,但在其他方面是有用的:

public class MyInitalizationDictionary : Dictionary<Type, Action<object>>
{
   public void Add<T>(Action<T> action)
   {
      this.Add(typeof(T), o => action((T)o)); //said overhead
   }
}

示例初始化器:

protected override IDictionary<Type, Action<object>> InitializationMap
{
   get
   {
      return new MyInitalizationDictionary
      {
         (INewSchoolWizardExtension o) => o.InitializeWizard(this),
         (INewSchoolWizardExtension o) => o.Start()
      };
   }
}

【讨论】:

  • 该死的 decPL,除了类名之外,这是我要写的逐字逐句:p
  • 是的,我去了Leonard of Quirm的命名学校:)
【解决方案2】:

让所有类型都实现一个初始化该类型的接口,并要求此字典中的操作中的所有对象都实现该接口。

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2018-11-22
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    相关资源
    最近更新 更多