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:IUIConcernExtensionT
- 我如何拥有一个属性,它保存我的
的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)