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
-在我看来,即使属性不是集合,场景也可以工作-你的答案似乎是正确的。谢谢你的帮助。