【问题标题】:Programming advice on creating a class using class name关于使用类名创建类的编程建议
【发布时间】:2012-05-18 19:20:32
【问题描述】:

好的,我搜索并看到了一些关于如何使用其名称创建类的问题。我的问题不太一样,所以我还是要问。

我的应用程序有 2 个类,例如“A”和“B”。在另一个类中,我需要使用这两个类(第三个类由外部服务调用)。外部服务仅将两个“A”和“B”类的名称作为字符串传递给我。在第三节课上,我知道我可以这样做:

case "A":
    create an instance of A
case "B":
    create an instance of B

但这似乎很奇怪。我想动态地做,所以我想做 Activator.CreateInstance 但不确定它是否是好的编程,因为当您远程加载程序集时似乎使用了“CreateInstance”。就我而言,一切都在一个项目中。

有什么建议吗?非常感谢!

【问题讨论】:

  • Activator.CreateInstance 既被框架大量使用,也被大量优化。它的使用没有任何问题。
  • 你提到的奇怪的 case "A": create instance [...] 也被称为工厂设计模式(可能没有应有的结构,但您可以为此使用switch/case)。您可以在此处阅读此模式:dofactory.com/Patterns/PatternAbstract.aspx 和此处:codeproject.com/Articles/68670/The-Factory-Pattern
  • 除了上面的链接之外,值得指出的是,如果您经常遇到这种模式,您可能需要研究像 Spring.NET、Castle Windsor 或 StructureMap 这样的控制反转框架.

标签: c# createinstance


【解决方案1】:

如果您想按名称创建的类数量有限(例如您的示例中的 2 个不同的类),我更喜欢使用“switch”的方式

public object ClassFactory(string ClassName)
{
    switch(ClassName)
    {
        case "A": return new A();
        case "B": return new B();
    }
}

因为它更快更安全(如果类名来自外部服务,想象一下,如果这个服务发送恶意类名会发生什么)。

否则 Activator.CreateInstance 应该不会有任何问题,但请确保彻底验证输入。

【讨论】:

  • 我认为它也会更快但不优雅。我仍然是一名初级程序员,正在努力学习一些专家的好技能。谢谢。
【解决方案2】:

这是使用工厂方法模式的完美案例。

http://www.dofactory.com/Patterns/PatternFactory.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    相关资源
    最近更新 更多