【问题标题】:C#, accessing classes from a referenced projectC#,从引用的项目中访问类
【发布时间】:2009-05-08 08:55:41
【问题描述】:

在 C# 中,我正在开发几个具有一些标准功能的 Windows 服务,因此我将所有这些通用功能放入一个单独的引用实用程序项目中。

我有一种情况,我需要使用 Activator.CreateInstance 从实用程序项目创建驻留在我的 Windows 服务项目中的业务类实例。

我的实用程序项目知道 Type.GetType 调用的命名空间和类名,但该类型始终为 null,当我想到它时,它无法从它所引用的项目中获取类型,或者可以吗?

简而言之:

项目 A 引用实用项目。
Utility Project 想要从 Project A 创建类,它知道命名空间和类名。

是否有我应该遵循的设计模式或方法来实现此功能?或者这看起来像是不,不,我应该重构?

感谢观看

【问题讨论】:

  • 感谢您的回复,我可能没有很好地解释,但使用实用程序库的项目在这种情况下不会对实用程序进行任何调用。实用程序库响应从单独的应用程序引发的事件,该事件的参数是我从中派生类详细信息的 XML 消息。一旦我创建了类,我想将 xml 作为参数传递给它的构造函数,并在构造函数中调用一个 process 方法,然后解析 xml。那么实用程序中的通用方法会帮助我吗?再次感谢。

标签: c# design-patterns inheritance types reference


【解决方案1】:

正如 Jon 指出的那样,您可以使用反射解决循环引用问题,但我建议重新考虑设计并对其进行重构。两个建议。

  • 使用接口对 A 和 B 进行十进制。(首选解决方案)
  • 将 A 和 B 需要的部分移到 C 中,仅从 A 和 B 中引用 C。

【讨论】:

    【解决方案2】:

    如果您希望 Type.GetType 查找不在 mscorlib 或调用程序集中的类型,则需要指定完全限定的程序集名称(包括版本等,如果它是强命名的)。

    例如:

    // Prints nothing
    Console.WriteLine(Type.GetType("System.Linq.Enumerable"));
    // Prints the type name (i.e. it finds it)
    Console.WriteLine(Type.GetType("System.Linq.Enumerable, System.Core, "
         + "Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"));
    

    或者,您能否在实用程序项目中将此作为通用方法,并让调用者将类型指定为类型参数?

    【讨论】:

      【解决方案3】:

      您可以查看依赖注入/ioc 容器。

      例如在实用程序库中创建一个接口并在 Windows 服务的特定类中实现该接口。然后将实例传递给实用程序类。这样,实用程序库就对 Windows 服务一无所知。

      【讨论】:

        【解决方案4】:

        听起来像是循环引用问题!你可能需要重构!

        【讨论】:

          猜你喜欢
          • 2017-07-04
          • 2010-12-23
          • 2018-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-18
          • 1970-01-01
          • 2020-04-27
          相关资源
          最近更新 更多