Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将泛型类型指定为参数param,而不知道_C#_.net_Generics - Fatal编程技术网

C# 将泛型类型指定为参数param,而不知道

C# 将泛型类型指定为参数param,而不知道,c#,.net,generics,C#,.net,Generics,我正在处理一个问题,但对泛型及其正确的声明/用法仍然有些无知。我得到了前提条件,但泛型的一些细节仍然让我摸不着头脑 给定以下代码(未编译且包含代码气味): 公共接口IUIConcern其中T:IUIConcernExtension { 字符串名称{get;} Func Extend(); } 公众关注 { 公共静态无效寄存器(字符串concernName,IUIConcern uiConcern),其中T:IUIConcernExtension { 关注点。添加(关注点); } 公共静态列表关注

我正在处理一个问题,但对泛型及其正确的声明/用法仍然有些无知。我得到了前提条件,但泛型的一些细节仍然让我摸不着头脑

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

公共接口IUIConcern其中T:IUIConcernExtension
{
字符串名称{get;}
Func Extend();
}
公众关注
{
公共静态无效寄存器(字符串concernName,IUIConcern uiConcern),其中T:IUIConcernExtension
{
关注点。添加(关注点);
}
公共静态列表关注点{
得到{
//逻辑。。。
}
设置{
//逻辑。。。
}
}
}
。。。我有几个问题:

  • 为什么我必须指定此部分
    公共静态无效寄存器(字符串concernName,IUIConcern uiConcern),其中T:IUIConcernExtension
    当我已经在声明中约束了
    public interface IUIConcern中的
    T
    时使用约束,其中T:IUIConcernExtension
  • 我如何拥有一个属性,它保存我的
    IUIConcern
    列表
    ,而不知道
    T
    ,除了知道它将从
    IUIConcernExtension
再一次,我意识到这不可编译,也不正确,只是想看看如何保存一个通用项列表,其中可能包含许多不同类型的
IUIConcern
元素


谢谢大家!

您需要有一个基本接口,例如:

public interface IUIConcern
{
    string Name { get; }
}

public interface IUIConcern<out T> : IUIConcern where T : IUIConcernExtension
{
    Func<T> Extern();
}
公共接口IUIConcern
{
字符串名称{get;}
}
公共接口IUIConcern:IUIConcern其中T:IUIConcernExtension
{
Func Extern();
}

您如何定义
关注点
寄存器
取决于您如何处理
T
。或者,如果您只处理您知道
T
的实例,您可以使用
字典
保存任何内容,或者根据您在控制器代码中需要的内容,潜在地删除基本接口并使用
对象
进行存储。

您需要有一个基本接口,例如:

public interface IUIConcern
{
    string Name { get; }
}

public interface IUIConcern<out T> : IUIConcern where T : IUIConcernExtension
{
    Func<T> Extern();
}
公共接口IUIConcern
{
字符串名称{get;}
}
公共接口IUIConcern:IUIConcern其中T:IUIConcernExtension
{
Func Extern();
}

您如何定义
关注点
寄存器
取决于您如何处理
T
。或者,如果您只处理您知道
T
的实例,您可以使用
字典
保存任何内容,或者根据您在控制器代码中需要的内容,潜在地删除基本接口并使用
对象
进行存储。

问题不在接口上,但是问题是因为您使用静态方法和属性的通用实现

Guvante的回答是正确的,他说您需要定义
IUIConcernExtension
,但这当然是非常合乎逻辑的,因此我假设您刚刚省略了这一部分,因为它与您面临的问题无关

代码中的问题是,您创建了一个具有静态方法和过程的类,其泛型定义不是在类级别而是在方法级别,因此,具有的属性和方法不能假定您始终具有相同的类型

假设你打电话:

Register<string>("something", UIConcern<string>) 
寄存器(“某物”,关注点)
但在此之前,您已经致电:

Register<Type>("something", UIConcern<Type>) 
寄存器(“某物”,关注点)
编译器怎么能允许你这么做?!因此,答案是在类级别定义泛型类型,所有属性和方法都将是相同的

此外,您还需要为列表使用私有成员,因为您所做的一切都是静态的,正确的代码应该是:

interface IUIConcernExtension
{
    string Name { get; }
}

public interface IUIConcern<out T> where T : IUIConcernExtension
{
    Func<T> Extend();
}

public class UIConcern<T> where T : IUIConcernExtension
{
    private static List<IUIConcern<T>> _Concerns = new List<IUIConcern<T>>();

    public static void Register(string concernName, IUIConcern<T> uiConcern) 
    {
        Concerns.Add(uiConcern);
    }

    public static List<IUIConcern<T>> Concerns
    {
        get { return _Concerns; }
        set { _Concerns = value; }
    }
}
接口IUIConcernExtension
{
字符串名称{get;}
}
公共接口IUIConcern,其中T:IUIConcernExtension
{
Func Extend();
}
公共类UIConcern,其中T:IUIConnextension
{
私有静态列表_Concerns=new List();
公共静态无效寄存器(字符串concernName,IUIConcern uiConcern)
{
关注点。添加(关注点);
}
公共静态列表关注点
{
获取{返回_关注点;}
设置{u关注点=值;}
}
}

问题不在接口上,而是由于使用静态方法和属性的通用实现造成的

Guvante的回答是正确的,他说您需要定义
IUIConcernExtension
,但这当然是非常合乎逻辑的,因此我假设您刚刚省略了这一部分,因为它与您面临的问题无关

代码中的问题是,您创建了一个具有静态方法和过程的类,其泛型定义不是在类级别而是在方法级别,因此,具有的属性和方法不能假定您始终具有相同的类型

假设你打电话:

Register<string>("something", UIConcern<string>) 
寄存器(“某物”,关注点)
但在此之前,您已经致电:

Register<Type>("something", UIConcern<Type>) 
寄存器(“某物”,关注点)
编译器怎么能允许你这么做?!因此,答案是在类级别定义泛型类型,所有属性和方法都将是相同的

此外,您还需要为列表使用私有成员,因为您所做的一切都是静态的,正确的代码应该是:

interface IUIConcernExtension
{
    string Name { get; }
}

public interface IUIConcern<out T> where T : IUIConcernExtension
{
    Func<T> Extend();
}

public class UIConcern<T> where T : IUIConcernExtension
{
    private static List<IUIConcern<T>> _Concerns = new List<IUIConcern<T>>();

    public static void Register(string concernName, IUIConcern<T> uiConcern) 
    {
        Concerns.Add(uiConcern);
    }

    public static List<IUIConcern<T>> Concerns
    {
        get { return _Concerns; }
        set { _Concerns = value; }
    }
}
接口IUIConcernExtension
{
字符串名称{get;}
}
公共接口IUIConcern,其中T:IUIConcernExtension
{
Func Extend();
}
公共类UIConcern,其中T:IUIConnextension
{
私有静态列表_Concerns=new List();
公共静态无效寄存器(字符串concernName,IUIConcern uiConcern)