我在遇到问题的同时仍然对泛型及其正确的声明/用法有些无知。我得到了前提,但是泛型的一些惯用法则仍然使我难以理解。

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

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


如何定义ConcernsRegister取决于您如何对待T。另外,如果仅处理您知道T的实例,则可以使用Dictionary<Type, List<IUIConcern>>来保存任何内容,或者可能会删除基本接口,并根据控制器代码中的需要使用object进行存储。

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

10-09 03:11