Jul*_*les 0 c# generics types interface
假设您正在编写库以在屏幕上显示内容,因此您可以创建一个IDisplayable界面.该接口有一种方法可以从对象创建控件:displayable.GetControl().
您想要创建自己的列表类型,可以显示:MyList<T>.现在这个列表只能T是一个IDisplayable,所以你可以在MyList类中询问T应该实现IDisplayable.但是当T不是IDisplayable时,你也想在某些地方使用这个列表类型(结果这个列表不可显示).那么可以说如果T实现了IDisplayable,MyList会实现IDisplayable吗?我也很高兴如果MyList<T>总是实现IDisplayable但是如果你尝试调用,GetControl()如果T不是IDisplayable,则会在运行时抛出异常,但我想知道是否有一种静态类型安全的方法来执行它.可以这样做吗?或者我在寻找错误的解决方案?
编辑:
我同意到目前为止MyList可能有太多责任的建议.我最初的想法是创造一个MyDisplayableList<T> : MyList<T> (where T : IDisplayable).
这种方法的问题是我有很多方法采用MyList并返回MyList(例如Linq中的Select方法).因此,如果我在MyDisplayableList上使用select,我会返回一个MyList,即使它是MyList,我也无法显示它...是否有一种类型安全的方法来处理C#中的这个问题?
你描述它是不可能的.您应该创建两种类型的列表:
public class MyList<T> : IList<T>
{
...
}
public class MyDisplayableList<T> : MyList<T> where T : IDisplayable
{
...
}
Run Code Online (Sandbox Code Playgroud)
简单.检查类型是否IDisplayable.如果不是,抛出一个InvalidOperationException:
if (!typeof(IDisplayable).IsAssignableFrom(typeof(T)))
throw new InvalidOperationException();
Run Code Online (Sandbox Code Playgroud)
或者,如果您有一个实例T,只需检查:
IDisplayable disp = instanceOfT as IDisplayable;
if (disp == null)
throw new InvalidOperationException();
// do stuff with `disp`.
Run Code Online (Sandbox Code Playgroud)
你的设计可能有缺陷.你可能会在课堂上投入太多而违反单一责任原则.首先重新检查您的设计.