我有一个名为“Communication”的对象,它有一个“CreatePdfFromTemplate”的方法。此方法将从Windows服务调用,该服务在表上具有SqlDependancy,该表将在网站上的方法添加新行时通知。
在我的方法中,我传递一个包含“Id”和“Name”的自定义对象列表。名称,是我需要使用反射加载的对象的名称。例如,“指令”。 “Id”是需要从数据库加载的“Name”中引用的对象的Id。在“通信”DLL的运行时中未引用或提供此对象。
我目前正处于第一关。我正在尝试将以下内容作为第一步:
// Load object information using Reflection
Type objectType = Assembly.GetExecutingAssembly().GetType(queueObject.Name);
int objectId = queueObject.Id;
我在搜索中找到了一些信息,说明有一种方法可以通过在应用程序缓存或GAC中使用DLL来加载DLL,但我不确定这是否是最好的方法。
我之前从未使用过Reflection,所以如果你对它有任何建议,或者我一般选择构建它的方式的任何建议(即网站向DB表添加行,Windows服务中的SqlDependancy触发,调用通信服务DLL创建PDF)。
为了给你提供更多信息,我选择这样做的原因是因为我的模板包含{Instruction.CreatedDate}等标签,其中“Instruction”是对象的名称,“CreatedDate”是属性的名称,其值将替换标记。
非常感谢有关如何在我的反射中加载此“指令”对象或仅在我的结构中加载任何帮助。如果我没有提供足够的信息,或者我所说的内容不够清楚,请告诉我(这是我的第一个StackOverflow问题,虽然我是一个很长时间的潜伏者)。
感谢。
- UPDATE -
好吧,使用Maarten提出的想法,我已经设法加载我的程序集并从中获取一个类型,但我的做法略有不同。我无法使用Assembly.LoadFile方法放入特定路径,所以我这样做了:
Assembly executingAssembly = Assembly.GetExecutingAssembly();
Assembly objectAssembly = Assembly.Load(executingAssembly
.GetReferencedAssemblies()
.Where(a => a.Name == "Common")
.FirstOrDefault());
这是有效的,因为我想要获取的类型是我的通信服务中名为“Common”的引用程序集的一部分(这是一个使用nuget来帮助保持最新的已安装程序包,因为它经常更改)
关于我如何做这些以及是否正确或错误的方式的任何进一步的帖子将被赞赏!
答案 0 :(得分:3)
使用Assembly.LoadFile或其他重载加载程序集。
使用Assembly.GetType获取类型。
获得类型后,请使用Activator.CreateInstance。
将其投放到dynamic,然后调用您的方法或设置您的媒体资源。我假设您使用的是.net 4.0。
var myAssembly = Assembly.LoadFile(...);
var myType = myAssembly.GetType(...);
dynamic myObject = Activator.CreateInstance(myType);
if (myObject != null) {
var createdDate = myObject.CreatedDate;
}