在 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()); 

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

你能在这里帮我吗?

在 C# 中创建自己的类型为“类型”的对象集合类型

您可以在类型参数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这样命名)?