C# 如何创建类型由编译器确定的泛型属性?
我已经搜索过了,找不到我需要做什么的答案。 我需要有两个从基类继承的类,具有泛型属性。属性的类型应由编译器确定,具体取决于类的类型。 现在,我有这个:C# 如何创建类型由编译器确定的泛型属性?,c#,.net,generics,properties,abstract,C#,.net,Generics,Properties,Abstract,我已经搜索过了,找不到我需要做什么的答案。 我需要有两个从基类继承的类,具有泛型属性。属性的类型应由编译器确定,具体取决于类的类型。 现在,我有这个: public abstract class AbstractClass<T> { public abstract List<T> Items { get; set; } } public class ChildClass1 : AbstractClass<MyType1> { public o
public abstract class AbstractClass<T>
{
public abstract List<T> Items { get; set; }
}
public class ChildClass1 : AbstractClass<MyType1>
{
public override List<MyType1> Items { get; set; }
}
public class ChildClass2 : AbstractClass<MyType2>
{
public override List<MyType2> Items { get; set; }
}
以这个基类为例:
public abstract class Base<T>
{
public abstract List<T> TheList { get; set; }
}
但同样,你必须事先告诉全班学生每样东西的类型
但是,如果不想创建子类,可以直接使用基类。从基类中删除“摘要”后,请使用:
var b1 = new Base<string>;
List<string> b1List = b1.TheList; //TheList is now a string list
var b1=新基数;
列表b1List=b1.t列表//列表现在是一个字符串列表
是的,创建新对象时必须设置类型,但不必创建子类
无论哪种方式,都必须在某个地方定义类型。如果要在子类或对象实例化中执行,则由您决定 以这个基类为例:
public abstract class Base<T>
{
public abstract List<T> TheList { get; set; }
}
但同样,你必须事先告诉全班学生每样东西的类型
但是,如果不想创建子类,可以直接使用基类。从基类中删除“摘要”后,请使用:
var b1 = new Base<string>;
List<string> b1List = b1.TheList; //TheList is now a string list
var b1=新基数;
列表b1List=b1.t列表//列表现在是一个字符串列表
是的,创建新对象时必须设置类型,但不必创建子类
无论哪种方式,都必须在某个地方定义类型。如果要在子类或对象实例化中执行,则由您决定 好吧,正如你所发现的,你不能那样做 但是为什么呢 因为
AbstractClass
不是类型,其中asAbstractClass
是类型。其中的“为什么”是“因为它就是这样运作的”
在某个阶段,您必须告诉编译器正在替换的T
类型。您定义类的方式是,在声明对该类的引用时,必须提前完成定义
您可以尝试其他方法,但如果不指定类型,您将永远无法使用该属性(除非您希望完全删除类型安全性,并且到处都有object
,但我认为没有人会推荐!)
您可以声明一个接口
interface GenericItems
{
T GetItems<T>();
}
那你就可以了
AbstractBaseClass abstractBaseClass = new ChildClass1();
abstractBaseClass.DoThis();
但是你不能这样做
AbstractBaseClass abstractBaseClass = new ChildClass1();
abstractBaseClass.Items.Count; // Compiler error, unknown property or method Items
好吧,正如你所发现的,你不能那样做 但是为什么呢 因为
AbstractClass
不是类型,其中asAbstractClass
是类型。其中的“为什么”是“因为它就是这样运作的”
在某个阶段,您必须告诉编译器正在替换的T
类型。您定义类的方式是,在声明对该类的引用时,必须提前完成定义
您可以尝试其他方法,但如果不指定类型,您将永远无法使用该属性(除非您希望完全删除类型安全性,并且到处都有object
,但我认为没有人会推荐!)
您可以声明一个接口
interface GenericItems
{
T GetItems<T>();
}
那你就可以了
AbstractBaseClass abstractBaseClass = new ChildClass1();
abstractBaseClass.DoThis();
但是你不能这样做
AbstractBaseClass abstractBaseClass = new ChildClass1();
abstractBaseClass.Items.Count; // Compiler error, unknown property or method Items
让您的
AbstractClass
已经继承了一个更通用的AbstractClass
,在编译时不知道类型T。在那里,您可以使用完全不依赖于T的常用方法。此时,您将无法直接访问基于t的任何项目
public abstract class AbstractClass
{
public abstract void MethodOnAbstractClass();
}
public abstract class AbstractClass<T>: AbstractClass
{
public abstract List<T> Items { get; set; }
}
让您的
AbstractClass
已经继承了一个更通用的AbstractClass
,在编译时不知道类型T。在那里,您可以使用完全不依赖于T的常用方法。此时,您将无法直接访问基于t的任何项目
public abstract class AbstractClass
{
public abstract void MethodOnAbstractClass();
}
public abstract class AbstractClass<T>: AbstractClass
{
public abstract List<T> Items { get; set; }
}
您希望编译器如何准确地推断抽象类的泛型类型
T
?该代码不会编译,您没有覆盖抽象属性。哎呀,我的意思是添加对Items属性的覆盖如果您没有添加任何附加功能,您甚至不必声明项
属性摘要,也不必重写它们。简单的public List Items{get;set;}
就足够了。您希望编译器如何准确地推断抽象类的泛型类型T
?该代码不会编译,您没有重写抽象属性。哎呀,我的意思是为Items属性添加重写如果您没有添加任何附加功能,您甚至不必声明项
属性摘要,也不必重写它们。简单的公共列表项{get;set;}
就足够了,但是,您可以放置一个公共抽象IList GetItems()在AbstractBaseClass
中添加code>,然后在AbstractBaseClass
中添加public override IList GetItems(){return Items;}
,这将允许您访问代码AbstractBaseClass.GetItems().Count
这不是我选择的设计方式,因为我更想知道我的集合中的对象是什么类型的,但这是可以做到的。是的,你可以,但我更希望有一个做这个抽象方法会返回计数,如果这是需要的,或者做计数需要做的事情。我知道你是说你不会那样做,但在我这样做之前,我会更深入地研究类设计的兔子洞在AbstractBaseClass
中添加code>,然后在AbstractBaseClass
中添加public override IList GetItems(){return Items;}
,这将允许您访问代码AbstractBaseClass.GetItems().Count
这不是我选择的设计方式,因为我更想知道我的集合中的对象是什么类型的,但这是可以做到的。是的,你可以,但我更希望中的一个方法这个抽象方法会返回计数,如果它是
AbstractClass child;
child = new ChildClass1();
int count1 = child.GetItems().Count;
child = new ChildClass2();
int count2 = child.GetItems().Count;