今では使われることも少ないArrayList。何とかして使い道が無いか考えて見ました。
ArrayListは動的にサイズを増減できる配列であり、何でもぶっこめる一件便利な奴ですが、要素に追加したものは問答無用でobjectになってしまうので、要素を取り出して使う時は元の型にキャストしないといけません。値型を入れれば当然ボックス化も発生します。
これらの理由から今はジェネリックで型安全のList<T>にその座を奪われています。
さて、今回はその何でもぶっこめる特性を活かし、要素の型当てクイズゲームを作って見ました。
ArrayListの要素に色んな型のオブジェクトを追加して、ランダムでその中から要素を選び、その型名が何であるか当てるという内容になっています。
ArrayListGame.cs
using System;
using System.Collections;
using System.Linq;
namespace ArrayListGame
{
class MainClass
{
public static void Main(string[] args)
{
//適当に色んな型のオブジェクトをぶっこむ
var list = new ArrayList();
list.Add("");
list.Add(0);
list.Add(new DateTime());
list.Add(new Exception());
//答えとなる型をランダムで選ぶ
Type answerType = list[new Random().Next(0, list.Count - 1 )].GetType();
//ランダムで選んだ型のメンバから公開メソッドの名前のみを抽出、オーバーロードの重複はまとめる。
var methods = answerType.GetMethods().Where(x => x.IsPublic).Select(x => x.Name).Distinct().ToList();
//その中からランダムでヒントとなるメソッド名を一つ取得
string hintMethodName = methods[new Random().Next(0, methods.Count - 1)];
Console.WriteLine($"問題 : このオブジェクトは「{hintMethodName}」メソッドを持っています。型名は何でしょう?");
//ヒントを参考に答えを入力
string answer = Console.ReadLine();
if(answerType.Name == answer)
{
Console.WriteLine("正解!");
}
else
{
Console.Write($"残念!答えは「{answerType.Name}」です。");
}
}
}
}
よしやってみよう!
問題 : このオブジェクトは「ToString」メソッドを持っています。型名は何でしょう?
ファッ!?
ToStringはみんな持っているからこういうのに当たったら詰む(笑)
もうちょっと工夫したら学習用プログラムとかに出来る…かも?
駄文失礼しました。