如何访问下面list2
中的list1
并在声明中检查IsnotNull
List<Object> list1= new List<Object>();
List<int> list2= new List<int>();
list1.add(someValue);
list1.add(list2);
Assert.IsNotNull(list1[1]..??);
答案 0 :(得分:2)
方法如下:
((List<int>)list1[1]).<something>
但是请使用一些体面的变量名。另外,List<Object>
是巨大的代码气味。
答案 1 :(得分:1)
@RobIII在他的答案中显示了如何将object
的值强制转换为List<int>
;但是,真正的问题是,您如何知道list1
中哪个位置包含什么?您最终将获得类似于以下代码的代码:
for (int i = 0; i < list1.Count; i++) {
object item = list1[i];
switch (item)
{
case int x:
// do some thing with x
break;
case string s:
// do some thing with s
break;
case IList list:
// do some thing with list
break;
....
}
}
这将变得乏味。
更好的方法是以面向对象的方式工作。例子
public abstract class Property
{
public string Name { get; set; }
public abstract void DoSomething();
}
public abstract class Property<T> : Property
{
public T Value { get; set; }
}
public class StringProperty : Property<string>
{
public override void DoSomething() =>
Console.WriteLine($"String of length {Value?.Length}");
}
public class IntListProperty : Property<List<int>>
{
public override void DoSomething() =>
Console.WriteLine($"Int list has {Value?.Count} items");
}
现在您可以写
var list1 = new List<Property>{
new StringProperty { Name = "string property", Value = "hello" },
new IntListProperty { Name = "Int list", Value = new List<int>{ 2, 3, 5, 7 } }
};
for (int i = 0; i < list1.Count; i++) {
Property prop = list1[i];
Console.Write(prop.Name); Console.Write(": ");
prop.DoSomething();
}
这称为多态。这意味着多形。您具有不同形状的属性,但是所有属性都有一个Name
和一个DoSomething
方法。您可以在不同类型的属性上调用此方法,并将不同的事情委派给这些属性。他们每个人都知道该怎么做。