繁体   English   中英

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

[英]Generic Method's Parameter Assigned to a Class Property

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

我有一个带有接受通用参数的方法签名的类。 因此,我使方法签名本身变得通用:

/// <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 over object可以避免麻烦,因为必须将object强制转换回其通用类型。 但是我对dynamic也不太满意,因为我没有编译类型的安全性Intellisense,如果我不小心的话,它在运行时可能是致命的。

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

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

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

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

  • 创建一个非通用基类或接口,以暴露集合中所需的功能,然后将其存储。 这也将使您可以使所有方法都是非通用的

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM