0

是否可以将整数、字符串和用户定义的类对象存储在一个数组列表中,例如

ArrayList a=new ArrayList();

class Demo {}
Demo d=new Demo();

a.Add(12);

a.Add("Faizal Sardar Khan");

a.Add(d);

如果一切皆有可能,那么如何访问存储的元素(如何将它们抛出)?如果没有,那么有没有办法实现这一点?

4

5 回答 5

2

您可以使用is关键字来检查对象的类型:

if (a[0] is String) /* do something */
if (a[1] is Demo) /* something other */
于 2013-11-04T15:54:08.403 回答
1

您可能并不关心究竟是什么对象,因此您可以将它们视为对象。

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]);

不管如何以及为什么,这些只是相同设计气味的变体......

于 2013-11-04T15:57:53.390 回答
0

是的,这当然是可能的。也可以通过List<Object>. 至于选角,那要看情况了。你怎么知道你的清单在哪里?但是要完成您的样本:

int twelve = (int)a[0];
string s = (string)a[1];
Demo e = (Demo)a[2];

很高兴知道您的最终目标是什么,因为我希望您尝试将 ArrayList 用作并非真正打算使用的东西,我们也许可以提出更好的方法。

于 2013-11-04T15:53:12.110 回答
0

您必须先检查元素的类型,然后才能使用它:

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 + "\".");
   }
}
于 2013-11-04T15:56:08.000 回答
0

可以(如果不建议)将不同类型的对象插入到 ArrayList 中,因为它只包含对象。

如何让他们再次出来是棘手的。一种方法是只使用一堆if条件来检查对象是否属于某种类型,然后将其转换为该类型。

于 2013-11-04T15:54:19.810 回答