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或者,您可以实现一个执行特定操作的方法,并在子类中重写它