2010-09-05 103 views
1

我试图做到以下几点在C#4.0:C#派生类型到泛型列表作为参数

我有一个基类和2派生类

 

public class Base {} 
public class DerivedClass1 : Base {} 
public class DerivedClass2 : Base {} 
 

我想要做这样的事情,但它不起作用。

如何告诉通用列表接受基类和基类的派生类。

 

public class Class_1 
{ 
    public Class_1() 
    { 
     List<DerivedClass2> list = new List<DerivedClass2>(); 
     new Class_2(list); 
    } 
} 

public class Class_2 
{ 
    public Class_2(List<Base> list) 
    { 

    } 
} 
 

在Java中我可以这样做

 

public class Class_2 
{ 
    public Class_2(List<? extends Base> list) 
    { 

    } 
} 
 

有些事情会这样的事情存在于C#

我希望我的问题是清楚的,它只是对名单的仿制药。

感谢很多提前:)

回答

2

我想你的意思之一:

// Define other methods and classes here 
public class Class_1 
{ 
    public Class_1() 
    { 
     List<DerivedClass2> list = new List<DerivedClass2>(); 
     new Class_2<DerivedClass2>(list); 
    } 
} 

public class Class_2<T> where T : Base 
{ 
    public Class_2(List<T> list) 
    { 

    } 
} 

或者,如果你想要的构造函数是通用的,而不是类:

// Define other methods and classes here 
public class Class_1 
{ 
    public Class_1() 
    { 
     List<DerivedClass2> list = new List<DerivedClass2>(); 
     Class_2.Create(list); 
    } 
} 

public class Class_2 
{ 
    public static Class_2 Create<T>(List<T> list) where T : Base 
    { 
     // Stuff 
     return new Class_2(/*Stuff*/); 
    } 

    public Class_2() 
    { 

    } 
} 
+0

非常感谢你:) – Drunkendo 2010-09-05 20:26:26

3

一般情况下:

function Foo<T>(List<T> list) where T : Base { 
    ... 
} 

加上接口和委托,C#允许CO /逆变。

例如, IEnumerable<T>IList<T>,您的代码将因此工作!请注意,如果允许使用List<T> s,则可以使用公共基类将Derived1插入到Derived2的列表中,这会破坏类型安全性。所以只需坚持上面的只读接口即可。

+0

非常感谢你:) – Drunkendo 2010-09-05 20:25:33