gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:18:22 29 4
gpt4 key购买 nike

我有一个名为“Communication”的对象,它有一个方法“CreatePdfFromTemplate”。此方法将从在表上具有 SqlDependancy 的 Windows 服务调用,该表将在网站上的方法添加新行时发​​出通知。

在我的方法中,我传递了一个具有“Id”和“Name”的自定义对象列表。名称,是我需要使用反射加载的对象的名称。例如,“指令”。 “Id”是需要从数据库中加载的“Name”中引用的对象的Id。此对象在我的“通信”DLL 的运行时未被引用或可用。

我目前正处于第一个障碍。作为第一步,我正在尝试执行以下操作:

// Load object information using Reflection
Type objectType = Assembly.GetExecutingAssembly().GetType(queueObject.Name);
int objectId = queueObject.Id;

我在搜索答案时发现了一些信息,这些信息表明有一种方法可以通过在应用程序缓存或 GAC 中提供 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com