在C#中检查内部集合类型

时间:2012-07-25 19:12:38

标签: c# .net

我对C#不熟悉并且不确定以下内容: 我有一个参数定义如下:

public Collection<object> InputObject
        {
            get { return inputObject; }
            set { inputObject= value; }
        }
        private Collection<object> inputObject;

如您所见,该对象是一组对象,因为我期待不同的类型。

以后我想检查类型,正确的方法是什么? 我试过这个:

if (inputObject is Collection<MyDefinedObject>)
{

}

但是我得到一个带下划线的警告,表明给定的表达式永远不是预期的类型。在集合中检查类型的正确方法是什么?

由于

6 个答案:

答案 0 :(得分:4)

您有一个对象

的集合

写作时

Collection<object>

这意味着您要定义一个可以包含任何对象的集合。

当你这样做时,你可以做类似的事情

inputObject.Add(new MyDefinedObject());
inputObject.Add(new StringBuilder()));

你最终会在你的收藏中找到不同的类型。

检查收藏品的特定元素

如果您想测试该集合中特定对象的类型,您可以这样做

Type t = inputObject[0].GetType();

if (inputObject[0] is MyDefinedObject)

代码

if (inputObject is Collection<MyDefinedObject>)

永远不会是真的,因为你已经定义了

private Collection<object> inputObject;

意味着您将集合 inputObject的类型定义为Collection<object>

如果我希望集合中的所有内容都是MyDefinedObject

,该怎么办?

根据您在问题下面的评论,这就是您真正想要的......

private Collection<MyDefinedObject> inputObject;

您收到的错误讯息

  

但我得到一个带下划线的警告,表示给定的表达式永远不是预期的类型

这是因为inputObject的类型为Collection<object>从不类型为 Collection 。这就像是说苹果永远不是香蕉。

更好的方法

如果您正在使用泛型并接收泛型集合,为什么不创建一个通用函数来处理该集合呢?

private void ProcessCollection<T>(Collection<T> inputObject)
{
}

// Somewhere else in your code...

Collection<MyDefinedObject> inputObject = // Initialize this however you do now
ProcessCollection<MyDefinedObject>(inputObject);

答案 1 :(得分:2)

由于您的Collection<>包含object,因此该集合(实质上)没有类型。您可以为集合指定实际类型,也可以检查集合中的项目是否为类型。

答案 2 :(得分:1)

所有对象都继承了基类对象,然后您可以使用:

if(InputObject[0].GetType()==typeof(string)){
//string is an example and 0 can be replaced with a index
}

知道每个对象的类型

答案 3 :(得分:1)

您需要检查所有内容。该集合被定义为对象

foreach (object obj in InputObject)
{
    obj.gettype();     
    if (obj is DocFieldEnumHierTwoSpeedLoader) x= 5;
}

答案 4 :(得分:0)

也许这就是你想要的:

        var defined = InputObject.OfType<MyDefinedObject>();
        var other = InputObject.OfType<MyOtherDefinedObject>();

        bool hasDefined = defined.Any();
        bool hasOther = other.Any();

答案 5 :(得分:0)

您说inputObject属性可以包含其集合类型可能随时变化的集合。有两种解决方案:

1)如果集合元素的类型对于定义属性的类型的给定实例始终相同,请将该类型设为通用:

public class MyClass<T>
{
    public Collection<T> InputObject 
    { 
        get { return inputObject; } 
        set { inputObject= value; } 
    } 
    private Collection<T> inputObject; 
}

如果属性的相同实例可以包含具有不同元素类型的集合,则将该字段声明为object,或者更好,将其声明为非泛型接口类型:< / p>

public class MyClass
{
    public ICollection InputObject
    {
        get { return inputObject; } 
        set { inputObject= value; }  // you should add some type checking here 
                                     //to make sure an invalid collection type isn't passed in
    }
    private ICollection inputObject;
    public Collection<T> GetTypedCollection<T>()
    {
        return (Collection<T>)inputObject; 
    }
}

GetTypedCollection方法要求您在编译时知道集合的类型是什么;如果不可能,您需要发布更多示例代码,以便我们建议解决方案。