通用方法的参数分配给类属性

时间:2013-01-20 13:39:53

标签: c# .net generics

我遇到了一种情况,我很好奇这个用例可能的解决方案或替代方案。

我有一个带有方法签名的类,它接受一个泛型参数。所以我使方法签名本身是通用的:

/// <summary>
///     Input Widget.
/// </summary>
public sealed class InputWidget {
    /// <summary>
    ///     Widget's Control.
    /// </summary>
    public IList<dynamic> Controls { get; private set; }

    public InputWidget AddControl<TC>(InputControl<TC> control) where TC : BaseControl<TC> {
        this.Controls.Add(control);
        return this;
    }
}

如果我想将该参数分配给类属性,无论出于何种原因,我都不能这样做,除非属性的类型是object,或者从.NET 4开始,dynamic

使用dynamic而非object,当我从列表中检索每个元素以供进一步使用时,我不得不解决将object强制转换为其泛型类型的问题。但我对dynamic也不太满意,因为我没有编译类型的安全性,Intellisense,如果我不小心,它在运行时可能是致命的。

那么为什么我不是简单地宣布我的课程是通用的?因为我不想限制我的方法接受特定类型的InputControl。此外,我还有其他方法,我省略了,需要相同的方法。如果用N个泛型类型定义我的类是很无聊的,其中N是这种情况下的方法数。

那么处理这样的场景的最佳方法是什么?我错过了什么吗?我想错了吗?更糟糕的是,我的设计完全错了,我需要再次开始阅读初学者书吗?

1 个答案:

答案 0 :(得分:0)

听起来你实际上在询问如何存储InputControl<TC>的集合,其中集合中的每个项目可以有不同的TC

有两种方法可以做到:

  • 创建一个非通用的基类或接口,从集合中公开所需的功能,然后存储它。这也可以让你的所有方法都是非通用的

  • InputControl<TC>替换为逆变接口,并使用List<IInputControl<BaseControl>>。使用逆变,您可以将任意IInputControl<TC>转换为IInputControl<BaseControl>