我在遇到问题的同时仍然对泛型及其正确的声明/用法有些无知。我得到了前提,但是泛型的一些惯用法则仍然使我难以理解。
给定以下代码(不编译且包含代码气味):
public interface IUIConcern<out T> where T : IUIConcernExtension
{
string Name { get; }
Func<T> Extend();
}
public class UIConcern
{
public static void Register<T>(string concernName, IUIConcern<T> uiConcern) where T : IUIConcernExtension
{
Concerns.Add(uiConcern);
}
public static List<IUIConcern<T>> Concerns{
get {
// Logic...
}
set {
// Logic...
}
}
}
... 我有几个问题:
为什么我必须指定此部分
public static void Register<T>(string concernName, IUIConcern<T> uiConcern) where T : IUIConcernExtension
我已经约束了声明
T
中的public interface IUIConcern<out T> where T : IUIConcernExtension
时出现约束我如何拥有一个保存我的
List<>
的IUIConcern<T>
的属性而又不知道T
而不知道它是从IUIConcernExtension
派生的呢?再一次,我意识到这无法编译并且是不正确的,只是想看看我如何保存可能具有许多不同类型的
IUIConcern<>
元素的通用项目列表。谢谢!
最佳答案
您需要具有基本接口,例如:
public interface IUIConcern
{
string Name { get; }
}
public interface IUIConcern<out T> : IUIConcern where T : IUIConcernExtension
{
Func<T> Extern();
}
如何定义
Concerns
和Register
取决于您如何对待T
。另外,如果仅处理您知道T
的实例,则可以使用Dictionary<Type, List<IUIConcern>>
来保存任何内容,或者可能会删除基本接口,并根据控制器代码中的需要使用object
进行存储。关于c# - 在不知道T的情况下将泛型指定为参数param,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16572778/