CheckedListBoxのチェック状態を簡単に取得・設定できるクラスを作成

using System.Linq.Expressions;
using System.Windows.Forms;

...

public class CheckedListBoxWrapper<T, Tvm, Tdm>
{
    CheckedListBox c;
    Func<T, Tvm> vmSelector;
    Func<T, Tdm> dmSelector;

    // コンストラクタ
    public CheckedListBoxWrapper(CheckedListBox c)
    {
        this.c = c;
    }

    // データソースの設定
    public void SetDataSource(
        IEnumerable<T> dataSource, 
        Expression<Func<T, Tvm>> vmSelector, 
        Expression<Func<T, Tdm>> dmSelector)
    {
        this.vmSelector = vmSelector.Compile();
        this.dmSelector = dmSelector.Compile();
        c.DataSource = dataSource.ToList();
        c.ValueMember = PocoHelper.GetName(vmSelector);
        c.DisplayMember = PocoHelper.GetName(dmSelector);
    }

    // チェックされた項目の設定と取得
    public IEnumerable<T> CheckedItems
    {
        get
        {
            var tmp = new List<T>();
            foreach (var item in c.CheckedItems)
            {
                tmp.Add((T)item);
            }

            return tmp;
        }
        set
        {
            for (int i = 0; i < c.Items.Count; i++)
            {
                var ret = value.Contains((T)c.Items[i]);
                c.SetItemChecked(i, ret);
            }
        }
    }

    // チェックされた値の設定と取得
    public IEnumerable<Tvm> CheckedValues
    {
        get
        {
            var tmp = new List<Tvm>();
            foreach (T item in c.CheckedItems)
            {
                tmp.Add(vmSelector(item));
            }

            return tmp;
        }
        set
        {
            for (int i = 0; i < c.Items.Count; i++)
            {
                var ret = value.Contains(vmSelector((T)c.Items[i]));
                c.SetItemChecked(i, ret);
            }
        }
    }

    // 全てのチェックをクリア
    public void ClearChecked()
    {
        for (int i = 0; i < c.Items.Count; i++)
        {
            c.SetItemChecked(i, false);
        }
    }

    // 全てチェック
    public void CheckAll()
    {
        for (int i = 0; i < c.Items.Count; i++)
        {
            c.SetItemChecked(i, true);
        }
    }
}

public class PocoHelper
{
    internal static string GetName<T, TKey>(Expression<Func<T, TKey>> e)
    {
        var member = (MemberExpression)e.Body;
        return member.Member.Name;
    }
}