Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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# 如何创建类型由编译器确定的泛型属性?_C#_.net_Generics_Properties_Abstract - Fatal编程技术网

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
不是类型,其中as
AbstractClass
是类型。其中的“为什么”是“因为它就是这样运作的”

在某个阶段,您必须告诉编译器正在替换的
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
不是类型,其中as
AbstractClass
是类型。其中的“为什么”是“因为它就是这样运作的”

在某个阶段,您必须告诉编译器正在替换的
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;