c# - Action 字典期望其键的类型

标签 c# generics types callback type-hinting

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

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 始终期望其键的类型?

最佳答案

这会带来一点点开销,但在其他方面还是有用的:

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()
      };
   }
}

关于c# - Action 字典期望其键的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26039265/

相关文章:

c# - 为什么为泛型发出 'box' 指令?

swift - 何时使用通用参数子句

c# - 当实体的 id 是不同类型(string/int)时,如何创建 CRUD 存储库?

c# - 未构建 csproj 时抑制 AfterBuild 目标

c# - 使用 SDK 获取 Azure VM 的 IP

Scala 嵌套案例类自绑定(bind)继承

c++ - 在 C++ 中将非 const 转换为 const

arrays - 在 Typescript 中重写 Array.of() 以扩展 Array 的自定义二维数组类

haskell - 类型检查器允许非常错误的类型替换,并且程序仍然可以编译

c# - 如何过滤枚举并在下拉列表中使用它