我有一个附加到主项目的类库项目,在这个类库项目中,我有一个名为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)中存在的类的类型?
答案 0 :(得分:2)
您使用的特定overload of GetType
状态:
如果类型在当前正在执行的程序集中或在Mscorlib.dll中,则只需提供其名称空间限定的类型名称即可。
但是您要加载的类型既不在Mscorlib.dll
中也不在 current 程序集中。因此,您需要提供程序集合格名称。像Child.ChildContacts, MainProject.dll
之类的东西(假设程序集的名称不是强名称)。
但是请注意我的评论,您可能应该改为让主项目为类库显式提供配置或工厂方法 1 ,这样它就不会尝试通过反射将消耗的应用程序拆开。 / p>
1 或者接受依赖注入 2 并设计您的类库以假定存在一个。然后只需将其列出为使用类库的要求,即在容器中注册了合适的Contacts
实现。