さらにあがいてみる

    public class AnyObject :  List
    {
        public AnyObject()
        {
        }

        public AnyObject(int data)
        {
            this.data = data;
        }

        public int data;

        public void Select(Selector anSelector, Executor anExecutor)
        {
            foreach (AnyObject anAnyObject in this)
            {
                if (anSelector(anAnyObject))
                {
                    anExecutor(anAnyObject);
                }
            }
        }
    }

    public delegate bool Selector(T anObject);

    public delegate void Executor(T anObject);

使い方はこんな感じ。

            AnyObject anAnyObject = new AnyObject();
            anAnyObject.Add(new AnyObject(0));
            anAnyObject.Add(new AnyObject(1));
            anAnyObject.Add(new AnyObject(2));
            anAnyObject.Add(new AnyObject(3));
            anAnyObject.Add(new AnyObject(4));
            anAnyObject.Add(new AnyObject(5));

            //実際に使ってみる。
            anAnyObject.Select(
                delegate(AnyObject anAnyObject2)
                {
                    return (anAnyObject2.data % 2) == 0;
                },
                delegate(AnyObject anAnyObject3)
                {
                    Console.WriteLine(anAnyObject3.data);
                }
            );

なんかこう、すでによく判らない領域にたどり着いてるような……。
何も知らないC#プログラマが見たら卒倒しそうなコードですね。
改行がSmalltalkに比べて多めなので、無理矢理改行を取っ払うとこんな感じ。

anAnyObject.Select(delegate(AnyObject anAnyObject2){return (anAnyObject2.data % 2) == 0;},
                delegate(AnyObject anAnyObject3){Console.WriteLine(anAnyObject3.data);});

いい線まで来てるような。ぬぐいきれない違和感はCやJavaの文法に長いこと浸っていた所為だろうなぁ。