使用类型T的成员创建类的实例,而不指定T类型

时间:2018-09-07 10:18:57

标签: c# generics

我有一个这种结构的类:

public class ClassName<T>
{
    public int Id {get;set;}
    public List<T> ObjectList { get; set; }
}

ClassName的集合位于ParentClass

public ParentClass
{
    public List<ClassName<T>> Property {Get;set;}
    //Other properties...
}

要创建此类的实例,我将执行以下操作:

var item = new ClassName<string>();

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

我尝试过

var item = new ClassName<null>();
var item = new ClassName();

但是显然这些都不起作用。...

2 个答案:

答案 0 :(得分:5)

  

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

简而言之:不。

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

  

因为并非该类的所有实例都需要此变量

我建议细分类别。

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

public class ClassName<T> : ClassNameBase
{
    public List<T> ObjectList { get; set; }
}

这样,您可以创建需要具有特定类型列表的对象。由于继承,它们还将具有基类提供的所有其他属性。

编辑:

如果要混合使用ObjectList和不使用public ParentClass { public List<ClassNameBase> Property {Get;set;} //Other properties... } 的对象的不同情况,则可以创建基本类型的集合:

Property

现在所有不同的兄弟都将很好地融入同一列表ObjectList

如果要访问其中之一的ClassName<int> temp = Property[0] as ClassName<int>; if(temp != null) { temp.ObjectList.Where(.... } ,则需要进行强制转换:

ThreadPoolExecutor

答案 1 :(得分:0)

之所以不能这样做,是因为如果不精确定义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>
{
}

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