1

文字列入力があり、その入力の値に応じて、特定のオブジェクトのコンストラクター(new Object1(int)、new Object2(string)、new Object3(int、int)など)を呼び出して、すべてを実装します。 IObjectインターフェイス)。

これをif/elseステートメントを連鎖させる明白な(そして遅い)方法ではなく、文字列からコンストラクターに移動する辞書を作成するようなことをしたいと思います(例:{"object1"-> new Object1(int) })

おそらく「typeof」をコンストラクターと組み合わせることによって、C#でこのようなことを行うことができる方法はありますか?ファクトリは避けたいのですが、並列コード構造が必要になるため、避けたいと思います。

前もって感謝します

4

3 に答える 3

5

あなたはこのようなことをすることができます:

var d = new Dictionary<string, Func<IObject>>();
d.Add("Object1", () => new Object1());
d.Add("Object2", () => new Object2());
d.Add("Object3", () => new Object3());
string typename = GetAStringFromSomewhere();
IObject foo = d[typename]();
于 2012-04-24T01:04:23.817 に答える
1

通常のアプローチは、Reflectionを使用することです

特に、Assembly.CreateInstance

于 2012-04-24T01:08:32.903 に答える
0

静的メソッドを定義して、必要なクラスごとにオブジェクトを作成し、辞書マッピング文字列を静的プロデューサーメソッドのデリゲート型に使用するのはどうですか?まあ、これはあなたの質問が正確に望んでいるものではないことを私は知っていますが、私はあなたの質問に今コメントすることはできません。

class Program
{
    delegate object GetObjDelegate();
    static Dictionary<string, GetObjDelegate> Dic = new Dictionary<string, GetObjDelegate>();

    static void Main(string[] args)
    {
        Dic.Add("aaa", A.GetObj);
        Dic.Add("bbb", B.GetObj);

        object a = Dic["aaa"]();
        object b = Dic["bbb"]();
    }
}

class A
{
    public A()
    {
    }

    public static A GetObj()
    {
        return new A();
    }
}

class B
{
    public B()
    {
    }

    public static B GetObj()
    {
        return new B();
    }
}
于 2012-04-24T01:40:46.230 に答える