我正在解决一个问题,但对泛型及其正确的声明/使用仍然一无所知。我得到了前提,但我仍然无法理解泛型的一些细节。
给定以下代码(不编译且包含代码异味):
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<>
的通用项目列表。元素。
谢谢!
最佳答案
你需要有一个基础接口(interface),例如:
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>>
持有任何东西,或者可能放弃基本接口(interface)并使用 object
存储取决于您在 Controller 代码中需要什么。
关于c# - 在不知道 T 的情况下将泛型类型指定为参数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16572778/