0

我是 C# 新手,遇到以下问题:

我需要创建一个 TypeCollection,它继承自 Collection,这里的对象类型是我创建的一些类型。

在 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 方法。这工作正常。这是正确的方法吗?

你能帮帮我吗?

4

4 回答 4

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>

于 2012-04-23T09:52:56.487 回答
0

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

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

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

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

或者您只想要一个所有对象都是 FDTObject 或其后代的集合。然后你可以只使用 aList<FDTObject>并且你有即时静态类型检查(如果这是你想要的最好的解决方案):

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

对我来说,它仍然很不清楚。你想向System.Type集合中添加实例(然后你需要直接删除类名之后的第一个泛型参数)?还是您只是碰巧选择Type了泛型参数的名称(这是一个糟糕的选择,因为已经有一个类型,即System.Type这样命名)?

于 2012-04-23T09:55:37.047 回答
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  
于 2012-04-23T10:05:29.647 回答
0

除非我误解了您想要的内容,否则您不能只使用通用列表吗?

您可以使用设置为基类的类型参数来初始化列表:

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

然后,您可以将任何对象添加到列表中FDTObject或继承自FDTObject

于 2012-04-23T10:06:47.780 回答