我对C#不熟悉并且不确定以下内容: 我有一个参数定义如下:
public Collection<object> InputObject
{
get { return inputObject; }
set { inputObject= value; }
}
private Collection<object> inputObject;
如您所见,该对象是一组对象,因为我期待不同的类型。
以后我想检查类型,正确的方法是什么? 我试过这个:
if (inputObject is Collection<MyDefinedObject>)
{
}
但是我得到一个带下划线的警告,表明给定的表达式永远不是预期的类型。在集合中检查类型的正确方法是什么?
由于
答案 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方法要求您在编译时知道集合的类型是什么;如果不可能,您需要发布更多示例代码,以便我们建议解决方案。