我试图在程序中创建一个通用例程,该例程将为我实例化对象。实际上负责调用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/