Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通用方法&x27;指定给类属性的参数_C#_.net_Generics - Fatal编程技术网

C# 通用方法&x27;指定给类属性的参数

C# 通用方法&x27;指定给类属性的参数,c#,.net,generics,C#,.net,Generics,我遇到了这样一种情况,我很好奇这个用例的可能解决方案或替代方案是什么 我有一个类,它具有接受泛型参数的方法签名。因此,我将方法签名本身设置为通用: /// <summary> /// Input Widget. /// </summary> public sealed class InputWidget { /// <summary> /// Widget's Control. /// </summary>

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

我有一个类,它具有接受泛型参数的方法签名。因此,我将方法签名本身设置为通用:

/// <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;
    }
}
//
///输入小部件。
/// 
公共密封类InputWidget{
/// 
///控件的控件。
/// 
公共IList控件{get;private set;}
公共InputWidget AddControl(InputControl控件),其中TC:BaseControl{
this.Controls.Add(control);
归还这个;
}
}
如果我想将该参数指定给类属性,无论出于何种原因,我都不能这样做,除非该属性的类型是
object
,或者从.NET 4开始,
dynamic

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

那么为什么我不简单地声明我的类是泛型的呢?因为我不想限制我的方法接受特定类型的
InputControl
。此外,我还定义了其他需要相同方法的方法,我省略了这些方法。如果用N个泛型类型定义我的类会很无聊,其中N是本例中的方法数


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

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

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

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

  • InputControl
    替换为逆变接口,并使用
    列表
    。使用逆变,您可以将任意
    IInputControl
    s转换为
    IInputControl


您要求执行的操作本质上是非类型安全的。如果我调用
AddControl()
,会怎么样?您可能需要非泛型基类型、协方差和/或约束。你想做什么?@SLaks我在方法签名中省略了类型约束。我在我的示例中再次添加了它。@SLaks基本上,我想了解解决此类问题的最佳方法是什么。我曾想过使用非泛型的基类型,事实上,这就是我现在解决它的方法。但是你介意提供其他建议的例子吗?虽然我不是特别问如何存储
InputControl
的集合,其中每个项都是不同的
TC
-在我看来,即使属性不是集合,场景也可以工作-你的答案似乎是正确的。谢谢你的帮助。