是否可以将整数、字符串和用户定义的类对象存储在一个数组列表中,例如
ArrayList a=new ArrayList();
class Demo {}
Demo d=new Demo();
a.Add(12);
a.Add("Faizal Sardar Khan");
a.Add(d);
如果一切皆有可能,那么如何访问存储的元素(如何将它们抛出)?如果没有,那么有没有办法实现这一点?
是否可以将整数、字符串和用户定义的类对象存储在一个数组列表中,例如
ArrayList a=new ArrayList();
class Demo {}
Demo d=new Demo();
a.Add(12);
a.Add("Faizal Sardar Khan");
a.Add(d);
如果一切皆有可能,那么如何访问存储的元素(如何将它们抛出)?如果没有,那么有没有办法实现这一点?
您可以使用is
关键字来检查对象的类型:
if (a[0] is String) /* do something */
if (a[1] is Demo) /* something other */
您可能并不关心究竟是什么对象,因此您可以将它们视为对象。
foreach(var o in myList)
Console.WriteLine(o);
如果您确切地知道类型,则可以强制转换。
Dog dog = (Dog)myList[26];
dog.Bark();
如果您想要根据类型不同的行为并且您不知道它们在哪里,您可以检查它们是什么:
// Reference types:
Dog dog = myList[i] as Dog;
if (dog != null)
dog.Bark();
Cow cow = myList[i] as Cow;
if (cow != null)
cow.Moo();
// Value types:
if (myList[i] is int)
DoSomethingWith((int)myList[i]);
不管如何以及为什么,这些只是相同设计气味的变体......
是的,这当然是可能的。也可以通过List<Object>
. 至于选角,那要看情况了。你怎么知道你的清单在哪里?但是要完成您的样本:
int twelve = (int)a[0];
string s = (string)a[1];
Demo e = (Demo)a[2];
很高兴知道您的最终目标是什么,因为我希望您尝试将 ArrayList 用作并非真正打算使用的东西,我们也许可以提出更好的方法。
您必须先检查元素的类型,然后才能使用它:
Object anything = list[0];
if (anything is Int32) {
var number = (Int32) anything;
} else if (anyting is String) {
var text = (String) anything;
} else {
if (Object.ReferenceEquals(null, anything)) {
throw new NotSupportedException("The element is NULL.");
} else {
throw new NotSupportedException("Unexpected type of the element \"" + anything.GetType().Name + "\".");
}
}
可以(如果不建议)将不同类型的对象插入到 ArrayList 中,因为它只包含对象。
如何让他们再次出来是棘手的。一种方法是只使用一堆if
条件来检查对象是否属于某种类型,然后将其转换为该类型。