2010-03-24 50 views
1

创建我neeed在C#这样的事情..在班级名单,但决定在运行时会是怎样的列表泛型列表在运行时

class A 
{ 
    List<?> data; 
    Type typeOfDataInList; 
} 

public void FillData<DataTyp>(DataTyp[] data) where DataTyp : struct 
{ 
    A a = new A(); 
    A.vListuBudouDataTypu = typeof(DataTyp); 
    A.data = new List<A.typeOfDataInList>(); 
    A.AddRange(data); 
} 

这是可以做到这样的事情?

回答

3

是的。

class A 
{ 
    IList data; 
    Type typeOfDataInList; 
} 

public void FillData<T>(T[] data) where T : struct 
{  
    A a = new A(); 
    A.typeOfDataInList = typeof(T); 
    A.data = new List<T>(data); 
} 

这将是更好地使A类通用:

class A<T> 
{ 
    IList<T> data; 
    Type typeOfDataInList; 
} 

public void FillData<T>(T[] data) where T : struct 
{  
    A<T> a = new A<T>(); 
    a.typeOfDataInList = typeof(T); 
    a.data = new List<T>(data); 
} 
+0

谢谢,这可能会起作用... – Perry 2010-03-24 20:20:03

5
class A<T> 
{ 
    public readonly List<T> Data = new List<T>(); 
    public Type TypeOfDataInList { get; private set; } 

    public A() 
    { 
     TypeOfDataInList = typeof(T); 
    } 

    public void Fill(params T[] items) 
    { 
     data.AddRange(items); 
    } 
} 

如果你不知道类型或具有不同类型的多个对象,声明的一个实例是这样的:

A<object> myClass = new A<object>(); 
myClass.Fill(new object(), new object()); 

否则,如果你知道类型,你可以这样做:

A<int> myInts = new A<int>(); 
myInts.Fill(1, 2, 5, 7); 
+1

您的填充方法使您可以使用params关键字。那么你的例子可能只是'myInts.Fill(1,2,5,7); ' – 2010-03-24 20:03:05

+0

@Matthew - 很棒的建议,已更新。 – jjxtra 2010-03-24 20:05:42

+0

我正在等待其中一个神秘的未来版本,其中PARAMS可以与IEnumerable <>一起使用(我不知道MS甚至是在想什么,更别说有时间表了。) – 2010-03-24 20:25:03

0

System.Collections.Generic.List<T>

+0

@Andrey:他/她不'在编译时t知道类型 – 2010-03-24 19:31:02

1

你可能要考虑一个泛型类:

public class A<T> where T : struct 
{ 
    public List<T> data; 
    public Type type; 
} 

public void FillData<DataType>(DataType[] data) where DataType : struct 
{ 
    A<DataType> a = new A<DataType>(); 
    a.data = new List<DataType>(); 
    a.AddRange(data); 
} 
2

您将需要使用反射来实例化IList < T >其中T在运行时才知道。

请参见下面的MSDN文章,这说明它比我能(向下滚动到如何构建一个通用型的部分): http://msdn.microsoft.com/en-us/library/b8ytshk6.aspx

下面是一个简单的例子:

 Type listType = typeof(List<>); 
     Type runtimeType = typeof(string); // just for this example 
     // assert that runtTimeType is something you're expecting 
     Type[] typeArgs = { runtimeType }; 
     Type listTypeGenericRuntime = listType.MakeGenericType(typeArgs); 
     IEnumerable o = Activator.CreateInstance(listTypeGenericRuntime) as IEnumerable; 
     // loop through o, etc.. 
+0

或者使用'ArrayList'或'List '。 – SLaks 2010-03-24 19:42:27

+2

区别在于,对于ArrayList或List ,代码可能会向集合中添加异构类型,而对于实例化的泛型类型,只会允许添加该类型或子类的对象。 – 2010-03-24 19:44:38

+0

这就是'IList'(非泛型类型)非常方便的地方,而不必编写大量的反射代码。 – leppie 2010-03-24 19:57:54