黒龍's Blog

明日から役立つ無駄知識をあなたに(仮)

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  170  : 記事  0  : コメント  2719  : トラックバック  26

ニュース

わんくま同盟に参加させていただきました。
どうぞよろしくお願いします。

自己紹介

コミュニティ

  • わんくま同盟
    わんくま同盟

書庫

.NET2.0からジェネリックが使えるようになり皆さんバンバン使われてると思いますが使い道の基本はやっぱりコレクションクラスでしょうか?

なので今回は他の使い方を紹介します

ファクトリメソッドで使う

あんまり見かけない例だと思ったのでファクトリメソッドで使ってみる例を。

public static class TableAdapterFactory
{
    /// <summary>
    /// 指定されたテーブルアダプターを生成し、コネクションを設定する
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    public static T GetTableAdapter<T>(SqlConnection con, int timeoutSec) where T : new()
    {
        T adapter = new T();
        Type type = adapter.GetType();
        PropertyInfo property = type.GetProperty("Connection");
        property.SetValue(adapter, con, null);
        MethodInfo method = type.GetMethod("SetCommandTimeout");
        if (method == null)
        {
            throw new TargetException("SetCommandTimeoutが存在しません");
        }
        method.Invoke(adapter, new object[] { timeoutSec });

        return adapter;
    }
}

※中でやってることはそれぞれ書き換えてください。この例では

  • TableAdapter側にSetCommandTimeoutを用意しておく
  • ConnectionとSetCommandTimeoutはpublicにしておく

ちょっとした事なんですがリフレクションと組み合わせると定型処理がいろいろまとめられちゃったりします。

Converter<T, TOutput>は面白い

あまりきれいな例じゃないんですがとりあえずこちらを

    public int HogeHoge
    {
        //適当な処理
            :
            :
        //適当な処理
        Converter<TreeNode, TreeNode> func = null;
        func = delegate(TreeNode src)
        {
            if (((PartsBookItemArgs)src.Tag).Item is PartsBookItemArgs.Infoページ構成)
                return src;
            else if (((PartsBookItemArgs)src.Parent.Tag).Item is InfomationType)
                return func(src.Parent);
            else
                return null;
        };

        TreeNode parentPageNode = func(target);
    }

えっと、そこでしか使わないような再帰処理をConverter使うと関数内でかけますよと。
ん~なにが言いたいか伝わりにくいな・・・。ちょっとした関数の場合のシグネイチャはConverterで済んじゃうので引数0~1個、戻り値0~1個のような場合はdelegateをいちいち作んなくても事足りると思うので。

投稿日時 : 2006年8月16日 18:52

コメント

No comments posted yet.

Post Feedback

タイトル
名前
Url:
コメント