- PR -

GenericなFactory

1
投稿者投稿内容
lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2007-03-26 23:31
コード:
public static class GenericFactory<T> where T : class
{
    public static T CreateInstance(Type type)
    {
        T instance;
        Assembly assembly;

        assembly = Assembly.GetAssembly(type);

        try
        {
            instance = assembly.CreateInstance(type.FullName, false) as T;
        }
        catch (InvalidCastException)
        {
            instance = default(T);
        }

        return instance;
    }
}


・制約 where T : classを外す方法
・catch → defaultの是非
・任意のアセンブリから型のインスタンスを生成するためのより汎用的なシグネチャ
・その他なんでも

 さあ、言いたがり屋諸君!思いのたけを述べてみたまえ↓
lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2007-03-26 23:33
 念のため文献への参照へのポインタ:

Gamma, Erich = Helm, Richard = Johnson, Ralph = Vlissides, John
「FACTORY METHOD」
『オブジェクト指向における再利用のためのデザインパターン 改訂版』
1999年 ソフトバンク パブリッシング pp115-126 ISBN 4797311126

Martin, Robert C.
「Factory パターン」
『アジャイルソフトウェア開発の奥義』
2004年 ソフトバンク クレィエイティブ pp343-352 ISBN 4797323361
lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2007-03-26 23:34
 では引き続きどうぞ↓
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2007-03-27 10:53

コード:
public static class GenericFactory1<T> where T : new()
{
    public static T CreateInstance()
    {
        T instance = new T();
        return instance;
    }
}




とか、


コード:
public static class GenericFactory2<T>
{
    public static T CreateInstance(params object[] args)
    {
        T instance;
        try
        {
            instance = (T)Activator.CreateInstance(typeof(T), args);
        }
        catch (MissingMethodException)
        {
            instance = default(T);
        }
        return instance;
    }
}




とかはどうですか。
catch → default は、このファクトリクラスの利用方法にもよる気がしますが、一般的には不要かと思います。
文献は読んでません。
lalupin4
大ベテラン
会議室デビュー日: 2004/07/26
投稿数: 163
投稿日時: 2007-03-27 22:48
>よこけん さん
引用:
よこけんさんの書き込み:
コード:
where T : new()


 なんか未知の記法キター!

引用:
とか、
コード:
public static T CreateInstance(params object[] args)


 なんかカッケーシグネチャキター!

 すんません。思い上がってました。議論がどう進もうと
「ActivaterのWrapperでよくね?」
で落とそうと考えていました。

 C#言語もSystem.Activatorメンバも完全には理解していなかったようです。

 すぐ追いつきます。ちょっと待っといてください。
1

スキルアップ/キャリアアップ(JOB@IT)