在 C# 中创建自己的类型为“类型”的对象集合类型
本文关键字:类型 对象 集合类 集合 创建 自己的 | 更新日期: 2023-09-27 18:31:55
我是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());
以获取类型,然后将其传递给实用工具方法。这工作正常。这是正确的方法吗?
你能在这里帮我吗?
您可以在类型参数Type
上设置约束,请参阅此处:http://msdn.microsoft.com/en-us/library/d5x73970(v=vs.80).aspx
这是静态检查的,您不需要像当前那样执行任何动态操作。具体说来:
public class ObjectTypeCollection<T> : Collection<T> where T : <base class name>
使用 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
除非我错过了你想要什么,否则你不能只使用通用列表吗?
可以使用设置为基类的类型参数初始化列表:
var list = new List<FDTObject>(); // assuming this is one of your base classes based upon your example.
然后,可以将任何FDTObject
对象或继承自FDTObject
的对象添加到列表中
Type.IsAssignableFrom
来检查一个类型的实例是否可以从另一个类型的实例分配(如果它们兼容)。喜欢这个:
if (typeof(FDTObject).IsAssignableFrom(item))
但是你的问题有点不清楚。也许您不想插入实际类型,而是插入特定类型的对象,并能够使用不同类型的实例化集合?然后,您可以约束类中的泛型参数:
public class ObjectTypeCollection<T> : Collection<T> where T: FDTObject
或者你只需要一个集合,其中所有对象都是FDTObject或其后代。然后你可以只使用一个List<FDTObject>
,你可以进行即时静态类型检查(如果这是你所说的,这是最好的解决方案):
List<FDTObject> fdtList = new List<FDTObject>();
对我来说,这仍然很不清楚。是否要将System.Type
的实例添加到集合中(然后需要直接删除类名之后的第一个泛型参数)?还是您只是碰巧选择了 Type
作为泛型参数的名称(这是一个糟糕的选择,因为已经有一个类型,即System.Type
这样命名)?