2012-04-23 74 views
0

我新的C#和我有以下问题:创建在C#类型“类型”的对象的自己的集合类型

我需要创建一个TypeCollection,从集合继承和对象的类型这里是我创建的一些类型。在InsertItem()重载的方法中,我想检查对象是否来自我创建的特定类型层次结构,否则我会抛出异常。

的代码片段连接:

public class ObjectTypeCollection<Type> : Collection<Type> 
{ 
    protected override void InsertItem(int index, Type item) 
    { 
     if(!(Utility.IsFDTObject(item.GetType()))) 
     {   
      throw new ArgumentException(string.Format("Type {0} is not valid", item.ToString())); 
     } 
     base.InsertItem(index, item); 
    } 
} 

的问题在这里与项目实例。它没有任何方法可以让我获得当前传入的类型。 GetType()不会返回我已经传递的类型。目前,我已经使用:

System.Type typ = System.Type.GetType(item.ToString()); 

获取类型,然后将其传递给Utility方法。这工作正常。这是正确的方法吗?

你能帮我吗?

+0

继承列表'GetType'得到你是一个项目*的类型*。 “我通过的类型”是什么意思? – Jon 2012-04-23 09:50:36

+0

通过使用'Type'作为通用参数名,你完全困惑了我。 – Botz3000 2012-04-23 10:03:56

+0

最后回复解决了我的问题。我使用IsAssignableFrom()来达到要求。我使用类型,因为它应该是一个类型的集合。 – user1064490 2012-04-23 11:08:44

回答

0

使用Type.IsAssignableFrom方法:

public class FDTObject {} 
public class MyDTObject1 : FDTObject {} 
public class MyDTObject2 : FDTObject { } 

public class ObjectTypeCollection : Collection<Type> 
{ 
    protected override void InsertItem(int index, Type item) 
    { 
     if (!typeof(FDTObject).IsAssignableFrom(item)) 
     { 
      throw new ArgumentException(string.Format("Type {0} is not valid", item)); 
     } 
     base.InsertItem(index, item); 
    } 
} 

用法:

var collection = new ObjectTypeCollection(); 
collection.Add(typeof(MyDTObject1)); // ok 
collection.Add(typeof(MyDTObject2)); // ok 
collection.Add(typeof(String)); // throws an exception 
+0

谢谢!:)这有助于... – user1064490 2012-04-23 11:10:42

1

您可以设置类型参数Type约束,在这里看到:http://msdn.microsoft.com/en-us/library/d5x73970(v=vs.80).aspx

这是静态检查,你不需要做任何事情的动态就像你正在做。具体做法是:

public class ObjectTypeCollection<T> : Collection<T> where T : <base class name>

+0

我认为,topic-starter需要System.Type的集合,这些成员是从某些基类型派生的。 – Dennis 2012-04-23 10:06:17

0

您可以使用Type.IsAssignableFrom检查一个类型的实例是从另一个类型的实例分配(如果它们是兼容)。像这样:

if (typeof(FDTObject).IsAssignableFrom(item)) 

但是你的问题有点不清楚。也许你不想插入实际的类型,而是插入特定类型的对象,并且能够使用不同类型实例化Collection。然后,你可以约束泛型参数在类:

public class ObjectTypeCollection<T> : Collection<T> where T: FDTObject 

或者你只是想收集所有的对象是一个FDTObject或它的后代。然后,你可以只使用一个List<FDTObject>和你有瞬间的静态类型检查(最好的解决办法,如果这是你itended什么):

List<FDTObject> fdtList = new List<FDTObject>(); 

对于我来说,它仍然还不是很清楚,但。你想添加System.Type的实例到集合中(那么你需要在类名后面直接删除第一个泛型参数)?或者你碰巧选择Type作为你的泛型参数的名称(这是一个不好的选择,因为已经有一个类型,即System.Type这样命名)?

+0

谢谢! IsAssignable工作。我之前使用过它,但我反过来使用它。 item.IsAssignableFrom(typeof(FDTObject))这显然是错的... – user1064490 2012-04-23 11:10:17

0

除非我missunderstanding你想要什么,你就不能使用generic list

你可以设置你的基类的类型参数初始化列表:

var list = new List<FDTObject>(); // assuming this is one of your base classes based upon your example. 

可以再任何对象添加到是FDTObjectFDTObject

相关问题