なんか、イテレータブロックは別にstaticで宣言する必要もないらしいです。
ただ、「イテレータクラスを自動生成する」都合上、スコープはpublicじゃないとダメ、らしい?
実行時に依存性注入しているのかコンパイラがベタでコード生成しているかはわかりません。(フレームワーク側の実装を考慮する必要もありませんケド。)

    abstract class DrowImageColorBarBase : DrawImageBase
    {
        /// <summary>
        /// カラーバーパターンの列挙からカラーバーを描画。
        /// </summary>
        /// <param name="aimg">描画するカンバス</param>
        protected override void doDrowImage(Bitmap aimg)
        {
            // (略)
        }

        /// <summary>
        /// カラーバーのパターンを列挙するイテレータブロック
        /// </summary>
        /// <returns>IBarPattern</returns>
        abstract public IEnumerable<IBarPattern> BarPattern();
    }

    class DrowImageSMPTEX : DrowImageColorBarBase
    {
        /// <summary>
        /// SMTPE形式に準じたカラーバーを表示するためのイテレータ。
        /// 下段1/4はオリジナル
        /// </summary>
        override public IEnumerable<IBarPattern> BarPattern()
        {
            yield return new Bar7Color();
            yield return new Bar7RevColor();
            yield return new BarGrayColorMixed();
            yield return new BarGrayGradation();
            yield return new BarGrayFullGradation();
        }
    }