【问题标题】:How to get the Type of a class in Main Project through a class in Class Library Project如何通过类库项目中的类获取主项目中类的类型
【发布时间】:2018-09-18 15:34:29
【问题描述】:

我有一个附加到主项目的类库项目,在这个类库项目中,我在这个类下有一个名为 SQSQueueScheduler.cs 的类,我编写了以下代码

Contacts contact = (Contacts)ConfigurationManager.GetSection("bolteContactConfiguration");
 if (contact != null)
        {
            className = contact.ClassName;
            Type myclass = Type.GetType(className);
            objContacts = (Contacts)Activator.CreateInstance(myclass);
        }

这里的Contacts是一个基类,我想通过它动态创建派生类ChildContacts的实例。这个基类存在于类库项目和主网站的派生类中。变量 className 的值为 Child.ChildContacts(AIST 是命名空间,AISTContacts 是类的名称)。在这里,我得到了 myClass 变量中的 Null 值。 我在主项目的web.config中写的代码是

<section name="bolteContactConfiguration" type="TDNBolte.Contacts,3DN Bolte" requirePermission="false"/>
<bolteContactConfiguration name ="Contacts" className="Child.ChildContacts"/>

这里的3DN Bolte是类库项目的程序集名称。

我想问一下,有没有办法通过类库项目的类(SQSQueueScheduler)中编写的代码来获取主网站(ChildContacts)中存在的类的类型?

【问题讨论】:

  • 让类库公开一些方法让 consumer 将此类信息传递给它和/或提供 factory 会更正常i> 方法,您可以通过这些方法构造所需的对象。让类库颠倒正常关系并遍历消费者的类在这里似乎是错误的。

标签: c# inheritance class-library custom-configuration


【解决方案1】:

您正在使用的特定 overload of GetType 状态:

如果类型在当前执行的程序集中或在 Mscorlib.dll 中,则提供由其命名空间限定的类型名称就足够了。

但您尝试加载的类型既不在 Mscorlib.dll 中,也不在 current 程序集中。因此,您需要提供程序集限定名称。 Child.ChildContacts, MainProject.dll 之类的东西(假设程序集不是强命名的)。

但请注意我的 cmets,您可能应该改为让主项目显式地向类库提供配置或工厂方法1,这样它就不会试图通过反射来分解消费应用程序。


1或者拥抱依赖注入2并设计你的类库来假设存在一个。然后只需将其列为使用类库的要求,即在容器中注册合适的Contacts 实现。

2例如Dependency injection in ASP.Net Core

【讨论】:

  • +1 用于依赖注入 - 这正是根据启动/执行项目为 lib 项目提供类所需要的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 2023-01-29
  • 2023-03-17
  • 2020-01-11
相关资源
最近更新 更多