c# - 如何从另一个 DLL 中的对象获取类型?

标签 c# object reflection gettype

我有一个名为“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,但我不确定这是否是最好的方法。

我以前从未使用过反射,所以如果您对它有任何建议,或者对我选择的一般结构方式有任何建议(即网站向数据库表添加行、Windows 服务中的 SqlDependancy 触发、调用用于创建 PDF 的通信服务 DLL)。

只是为了给您提供更多信息,我选择这样做的原因是因为我的模板包含诸如 {Instruction.CreatedDate} 之类的标签,其中“Instruction”是对象的名称,“CreatedDate”是属性的名称,其值将替换标记。

任何有关如何在我的反射中加载此“指令”对象或仅在我的结构上加载此“指令”对象的帮助都非常感谢。如果我没有提供足够的信息或者我所说的不够清楚,请告诉我(这是我的第一个 StackOverflow 问题,尽管我已经潜伏了很长时间)。

谢谢。

--更新--

好吧,使用 Maarten 提出的想法,我已经成功加载了我的程序集并从中获取了类型,但我的做法略有不同。我无法使用 Assembly.LoadFile 方法放入特定路径,因此我这样做了:

Assembly executingAssembly = Assembly.GetExecutingAssembly();
Assembly objectAssembly = Assembly.Load(executingAssembly
                                          .GetReferencedAssemblies()
                                          .Where(a => a.Name == "Common")
                                          .FirstOrDefault());

这是有效的,因为我试图获取的类型是我的通信服务中名为“Common”的引用程序集的一部分(这是一个使用 nuget 来帮助保持最新的安装包,因为它经常更改) .

任何有关我如何做到这一点以及这是正确还是错误的方法的进一步帖子将不胜感激!

最佳答案

使用 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;
}

关于c# - 如何从另一个 DLL 中的对象获取类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16144959/

相关文章:

c# - 异步发布到 Azure 队列

c++ - 创建类对象的无序映射

java - 如何在java中通过BeanInfo<I>访问私有(private)字段

c# - 使用基于枚举标志的构造函数创建对象

java - 从使用反射获得的 RecyclerView 调用方法

c# - 在 C# 中使用 "params"关键字作为泛型参数

c# - 这两个字符串有什么区别?

c# - Winforms 托盘应用程序和 WM_CLOSE

javascript - JavaScript 中还有其他方法获取对象属性吗?

android - 将对象声明移到函数之外会导致崩溃