c# - 在不知道 T 的情况下将泛型类型指定为参数参数

标签 c# .net generics

我正在解决一个问题,但对泛型及其正确的声明/使用仍然一无所知。我得到了前提,但我仍然无法理解泛型的一些细节。

给定以下代码(不编译且包含代码异味):

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();
}

您将如何定义 ConcernsRegister将取决于您如何对待 T .或者,如果您只处理您知道 T 的实例, 你可以使用 Dictionary<Type, List<IUIConcern>>持有任何东西,或者可能放弃基本接口(interface)并使用 object 存储取决于您在 Controller 代码中需要什么。

关于c# - 在不知道 T 的情况下将泛型类型指定为参数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16572778/

相关文章:

c# - 无法加载文件或程序集 'Microsoft.Data.Edm'

.net - 什么是最受欢迎的基于 .Net 的 CMS?

.net - 从单个 .csproj 构建(非 PCL)Monotouch 或 .net dll

c# - 如何配置 ASP.NET 应用程序的环境?

java - 为什么这会在 Java 中编译?

java - 将类传递给 Kotlin 具体化方法

c# - 检查generic是否为0

c# - HttpWebRequest C# 的 API 超时错误 |与 postman 和 restsharp 一起工作

c# - 现有对象实例上的鸭子类型(duck typing)/动态代理

c# - x.toString() 和 x +""之间的区别