2

我是 C# 的新手,不确定以下内容:我有一个参数定义如下:

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

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

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

if (inputObject is Collection<MyDefinedObject>)
{

}

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

谢谢

4

6 回答 6

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 是 type 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);
于 2012-07-25T19:16:26.273 回答
2

由于您的Collection<>contains object,该集合(本质上)没有类型。你要么给集合一个实际的类型,要么检查集合中的项目的类型。

于 2012-07-25T19:15:28.787 回答
1

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

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

知道每个对象是哪种类型

于 2012-07-25T19:17:12.197 回答
1

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

foreach (object obj in InputObject)
{
    obj.gettype();     
    if (obj is DocFieldEnumHierTwoSpeedLoader) x= 5;
}
于 2012-07-25T19:20:05.307 回答
0

也许这就是你想要的:

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

        bool hasDefined = defined.Any();
        bool hasOther = other.Any();
于 2012-07-25T19:44:24.857 回答
0

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

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

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

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

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 方法要求您在编译时知道集合的类型是什么;如果这不可能,您需要发布更多示例代码,以便我们提出解决方案。

于 2012-07-25T19:45:22.990 回答