1

我有字符串输入,根据该输入的值,我想调用特定对象的构造函数(new Object1(int)、new Object2(string)、new Object3(int, int)等都实现了IObject 接口)。

而不是这样做链接 if/else 语句的明显(和缓慢)的方式,我想做一些事情,比如有一个从字符串到构造函数的字典(例如 {"object1" -> new Object1(int) })

有什么方法可以在 C# 中做这样的事情,也许是通过将“typeof”与构造函数结合起来?我想避免使用工厂,因为那需要并行代码结构,而我想避免这种情况。

先感谢您

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

通常的方法是使用反射

特别是,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 回答