0

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

我有一个带有接受泛型参数的方法签名的类。所以我将方法签名本身设为通用:

/// <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

当我从列表中检索每个元素以供进一步使用时,使用dynamicover可以省去我必须将其转换回其泛型类型object的麻烦。object但我也不太满意,dynamic因为我没有获得编译类型安全、Intellisense,如果我不小心,它在运行时可能是致命的。

那么为什么我不简单地声明我的类是通用的呢?因为我不想限制我的方法来接受InputControl特定类型的。此外,我还定义了其他方法,但我省略了,它们需要相同的方法。如果用 N 个泛型类型定义我的类会很无聊,在这种情况下,N 是方法的数量。

那么处理这种情况的最佳方法是什么?我错过了什么吗?我想错了吗?更糟糕的是,我的设计完全错误,我需要重新开始阅读初学者书籍吗?

4

1 回答 1

0

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

有两种方法可以做到这一点:

  • 创建一个非泛型基类或接口,从集合中公开您需要的功能,并将其存储起来。这也将允许您将所有方法设为非泛型

  • 替换InputControl<TC>为逆变接口,并使用List<IInputControl<BaseControl>>. 使用逆变,您将能够将任意IInputControl<TC>s 转换为IInputControl<BaseControl>.

于 2013-01-20T13:52:25.890 回答