请教一个C#中类的声明的相关问题

howze 2020-10-10 06:18:11
我遇到了一个奇葩问题,具体是这样的。

有一个类如下:



class Child
{
private int age;

private string name;

private Mydll test;

public void PrintChild()
{
Console.WriteLine("hello");
}

}



其中有一句:

private Mydll test;


这个“Mydll”类型是来自一个外部引用的dll里的变量类型。

业务逻辑是这样的

程序运行后,用户可能会加载这个外部的dll,也可能不加载这个dll,把他理解为一个扩展,我也不知道用户是否会加载,并且业务上也不能强制用户去加载,那么问题来了。

如果用户加载了这个dll,那么这句
private Mydll test;
就可以正常执行

如果用户没加载这个dll,那么这句
private Mydll test;
就会报错。

但是我又不能不写
private Mydll test;
这句,万一用户加载了呢。

所以问题就是,如果根据用户是否加载这个dll来动态声明这个变量类型?

谢谢!
...全文
8272 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2020-10-11
  • 打赏
  • 举报
回复
1.这个“Mydll”类型是来自一个外部引用的dll里的变量类型。 这个描述本身就已经有问题了,你首先的引用才会有这个mydll类型,你不引用他,他怎么来的呢? 所以你说的已经有问题了。 你需要先抽象出稳定的无关这个dll的一个公共的抽象dll。你主机程序只依赖这个公共的抽象dll (比如netcore 里的Ilog,Ihost,你会发现微软通常是一个Microsoft.Extensions.Configuration.Abstractions公共抽象) 剩下的实现,我们也不说啥现在的新东西了,就用比较古老的玩意就好,具体技术我不想他过描述,可以参考MEF(虽然MEF也有各种各样的毛病,不过这里的人也不想接触新东西,就这种老技术描述就好了,当然他更老的技术的是遍历目录,反射load 在根据元数据过滤。)
  • 打赏
  • 举报
回复
"正常的“情况下,一个后果有一定严重性的事件一定要有一种“协议、文档”的形式存在,是先有设计然后才有实现(中间要经过讨论)。因为明显这个 test 会垮掉,它让我们的程序垮掉而没有给我们一个合理合法的协议文档告诉我们如何编程,那么通常我们会否决这个东西,而不是兼容它。
  • 打赏
  • 举报
回复
如果“报错”不会将进程垮掉,而且也不阻塞系统很长时间,那么你可以把它的状态保存起来,例如
private bool? _garbageFlag;

public bool GarbageInUse
{
get
{
if(!_garbageFlag.HasValue)
try
{
var x = test;
_garbageFlag = true;
}
catch
{
_garbageFlag = false;
}
return _garbageFlag.Value;
}
}
threenewbee 2020-10-10
  • 打赏
  • 举报
回复
把你所谓“加载”的代码贴出来才知道你应该怎么写。
八两 2020-10-10
  • 打赏
  • 举报
回复
楼主这是何苦,直接声明为object类型,运行时用反射来赋值就是了。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧