C# 使用类型为T的成员创建类的实例,但不指定T类型

C# 使用类型为T的成员创建类的实例,但不指定T类型,c#,generics,C#,Generics,我有这样一个结构的类: public class ClassName<T> { public int Id {get;set;} public List<T> ObjectList { get; set; } } 要创建此类的实例,我将执行以下操作: var item = new ClassName<string>(); 但是很明显,这些都不起作用……您不能这样做,因为如果您不精确地定义类型t,那么.NET如何知道初始化列表中对象的类型 但

我有这样一个结构的类:

public class ClassName<T>
{
    public int Id {get;set;}
    public List<T> ObjectList { get; set; }
}
要创建此类的实例,我将执行以下操作:

var item = new ClassName<string>();

但是很明显,这些都不起作用……

您不能这样做,因为如果您不精确地定义类型t,那么.NET如何知道初始化列表中对象的类型

但仅供参考,您可以执行简单的继承,例如:

public static void Main(string[] args)
{
    var c = new MyClass();
    var d = new MyClass<long>();
}

class MyClass<T>
{
    public List<T> ObjectList { get; set; }
}

class MyClass: MyClass<int>
{
}
publicstaticvoidmain(字符串[]args)
{
var c=新的MyClass();
var d=新的MyClass();
}
类MyClass
{
公共列表对象列表{get;set;}
}
类MyClass:MyClass
{
}

使用上面的代码,当您编写
newmyclass()时
,默认情况下,它使用类型
int
初始化列表

您不能这样做,因为如果不精确定义类型t,.NET如何知道初始化列表中对象的类型

但仅供参考,您可以执行简单的继承,例如:

public static void Main(string[] args)
{
    var c = new MyClass();
    var d = new MyClass<long>();
}

class MyClass<T>
{
    public List<T> ObjectList { get; set; }
}

class MyClass: MyClass<int>
{
}
publicstaticvoidmain(字符串[]args)
{
var c=新的MyClass();
var d=新的MyClass();
}
类MyClass
{
公共列表对象列表{get;set;}
}
类MyClass:MyClass
{
}
使用上面的代码,当您编写
newmyclass()时
,默认情况下,它使用类型
int
初始化列表

是否可以在不指定T类型的情况下创建此类的实例

简言之,没有

关于您的评论,以及您为什么要这样做:

因为不是所有的类实例都需要这个变量

我建议把这些课程细分

public class ClassNameBase
{
    public int Id {get;set;}
}

public class ClassName<T> : ClassNameBase
{
    public List<T> ObjectList { get; set; }
}
现在,所有不同的兄弟将很好地放入同一个列表
属性

如果要在需要强制转换的元素之一中访问
对象列表

ClassName<int> temp = Property[0] as ClassName<int>;

if(temp != null)
{
    temp.ObjectList.Where(....
}
ClassName temp=Property[0]作为类名;
如果(温度!=null)
{
临时对象列表,其中(。。。。
}
是否可以在不指定T类型的情况下创建此类的实例

简言之,没有

关于您的评论,以及您为什么要这样做:

因为不是所有的类实例都需要这个变量

我建议把这些课程细分

public class ClassNameBase
{
    public int Id {get;set;}
}

public class ClassName<T> : ClassNameBase
{
    public List<T> ObjectList { get; set; }
}
现在,所有不同的兄弟将很好地放入同一个列表
属性

如果要在需要强制转换的元素之一中访问
对象列表

ClassName<int> temp = Property[0] as ClassName<int>;

if(temp != null)
{
    temp.ObjectList.Where(....
}
ClassName temp=Property[0]作为类名;
如果(温度!=null)
{
临时对象列表,其中(。。。。
}


为什么要这样做?如果只想接受任何类型的参数,请使用new ClassName()。但这是非常不健康的。如果您的类型有泛型参数,您肯定必须提供它。不提供泛型参数的好处是什么?为什么需要它?可能您想要一个非泛型基类,泛型基类从中派生?这是否意味着并非所有实例都需要
对象列表
?如果TEMS不使用<代码>列表>代码>为什么不让接口的泛型部分成为一个子类专业化?你将最终得到“<代码>类别名< /COD>和<代码>类专门化的类名:CaseNox然后你应该考虑从基类继承一个额外的类型。除了任何类型的参数外,请使用新的ClassName()。但这是非常不健康的。如果您的类型有泛型参数,您肯定必须提供它。不提供泛型参数的好处是什么?为什么需要它?可能您想要一个非泛型基类,泛型基类从中派生?这是否意味着并非所有实例都需要
对象列表
?如果TEMS不使用<代码>列表>代码>为什么不让接口的泛型部分成为一个子类专业化?你将最终得到<代码>类CordNe> <代码>和<代码>类专门化的类名:CaseNox。然后你应该考虑从基类继承一个额外的类型。最好不要包括泛型。和
List
在基类中吗?同意@spender的设计,应该像Mong-zhu的答案一样,不在基类中包含泛型和
List
不是更好吗?同意@spender的设计,应该像Mong-zhu的答案一样。我尝试过这个实现,但看不到如何访问继承类的属性,例如ParentClass.Property。ObjectList@Alex您需要强制转换它们:
(ParentClass.Property[0]作为类名).ObjectList
如果元素没有ObjectList并且不能被删除,则应在此处检查nullcasted@Alex或者,您可以实现一个执行特定操作的方法,并在子类中重写它。我已尝试过此实现,但看不到如何访问继承类的属性,例如ParentClass.Property.ObjectList@Alex或者您需要将它们强制转换为:
(ParentClass.Property[0]作为类名)。ObjectList
如果元素没有ObjectList并且不能被转换,则应在此处检查nullcasted@Alex或者,您可以实现一个执行特定操作的方法,并在子类中重写它