在 C# 中获取整个程序集
本文关键字:程序集 获取 | 更新日期: 2023-09-27 18:35:27
我正在尝试消除来自我的 API 的调用,最终用户必须在他们的代码中传递Assembly.GetExecutingAssembly()
,目前我的代码看起来如下。
public static Dictionary<int, Packet> Packets { get; private set; }
public static void Init()
{
Assembly assembly = Assembly.GetExecutingAssembly();
foreach (Type type in assembly.GetTypes())
{
if (type.BaseType == typeof(Packet))
{
...
}
}
}
但是,这仅获取 API.dll 中可用的所有类,并且不包含使用该.dll的项目中的任何类,
但是,如果我将其作为参数传递,如下所示:
public static void Init(Assembly assembly) {}
它加载一切就可以了,这是预期的行为,有没有办法在后台完成这一切,而最终用户不必担心 Assmebly 调用?
简而言之 - 我有一个人们将在他们的项目中使用的.dll文件,我想从使用该.dll的项目中获取所有类,而不是.dll中的所有类
它像Assembly.GetCallingAssembly一样简单吗?
为什么要限制客户端必须在单个程序集中定义其Packet
类? 如果客户端想要在不同的程序集中实现不同类型的Packet
类,该怎么办? 如果有人想在运行时生成运行时代码并在运行时创建Packet
类怎么办?
您的 API 不应关心数据包类的定义位置或方式。 它应该只公开一个接口,该接口将允许客户端直接注册新的Packet
类型。 这将为客户提供最大的灵活性。
现在,提供帮助程序方法,以便客户端可以从程序集或调用程序集注册类型。
像这样:
class PacketRegistration {
public void RegisterPacketType(Type packetType) {...}
public void RegisterPacketType<TPacket>() where TPacket:Packet {
RegisterPacket(typeof(TPacket));
}
public void RegisterPacketTypesFromAssembly(Assembly assembly) {...}
public void RegisterPacketTypesFromCurrentAssembly() {
RegisterPacketTypesFromAssembly(Assembly.GetCallingAssembly());
}