我试图在程序中创建一个通用例程,该例程将为我实例化对象。实际上负责调用new Object()的例程位于工厂中必须实例化的其他程序集中。

namespace ExternalLib
{
    class Object1Factory
    {
        public Object1 getObject1()
            //...
    }
    class Object2Factory
        // Same implementation as Object1Factory
}


我正在尝试为我的应用程序提供一个例程,该例程将允许我调用适当的例程来为我“更新”对象。

namespace MyApp
{
    class Program
    {
        static void Main()
            //...
        static Object getNewObject(string typeName)
        {
            //This is where I have problems
        }
    }
}


我可以访问外部库的源代码以及我的程序,尽管对体系结构进行整体重写的成本太高。

我尝试过的
我最初的想法是在工厂和/或工厂例程上使用自定义属性,并使用反射来获取方法,然后调用该方法。我最初使用签名private static T getNew<T>()并尝试在type参数上使用switch语句,但是意识到getNewObject(string typeName)会更容易。工厂具有相同的构造函数签名,但没有继承链接。

总而言之:创建对象的例程在另一个程序集中在工厂中,如何自动调用这些例程以基于类型获取对象?

最佳答案

如果您想沿这条路走下去,可以将所有工厂方法放在一个名为“ ObjectFactory”的工厂类中吗?

Type t = typeof(OtherAssembly.ObjectFactory);

MethodInfo m = t.GetMethods().Where(a => a.ReturnType.Name == typeName).FirstOrDefault();

return m.Invoke(null, new object[] { /* PARAMETERS */ });




编辑-回应詹姆斯对问题的评论,指出他希望将工厂课程分开:

(在下面使用Martin的想法,并依赖于所有名称为“ [Type] Factory”的Factory类)

(工厂类也有非静态方法)

Type t = Type.GetType(String.Format("OtherAssembly.{0}Factory", typeName));

var myFactory = Activator.CreateInstance( t );

MethodInfo m = t.GetMethods().Where(a => a.ReturnType.Name == typeName).FirstOrDefault();

return m.Invoke(myFactory, new object[] { /* PARAMETERS */ });

关于c# - 如何将类型与另一个程序集中的工厂例程配对?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10722928/

10-17 01:12