gpt4 book ai didi

c# - 在 "friend"程序集中隐藏内部接口(interface)

转载 作者:行者123 更新时间:2023-11-30 16:33:41 25 4
gpt4 key购买 nike

我有两个程序集:A 和 B。A 为 B 设置了 InternalsVisibleTo。我想从 A 进行调用以获取只能由 B 中定义的类型以保持内部信息的方式知道的信息。我可以使用在 A 中定义并在 B 中显式实现的内部接口(interface)来执行此操作。

程序集 A

  internal interface IHasData
{
Data GetData();
}

class ClassA
{
DoSomething(IHasData);
}

程序集 B

  public abstract class ClassB : IHasData
{
Data IHasData.GetData() { /** do something internal **/ }
}

当有人引用程序集 B 并派生自 ClassB 时,问题就来了——他们收到错误:“类型‘AssemblyA.IHasData’是在未引用的程序集中定义的”,即使该类型对他们来说应该是不可见的。如果我查看公共(public)类型定义,我会看到我所期望的 - 没有实现接口(interface)的 ClassB。

为什么会出现此错误?所有实现都在程序集 B 中。我可以在 ClassB 内部使用 IHasData 并且不需要引用程序集 A。有人可以帮助我了解发生了什么吗?

最佳答案

这是一个有趣的发现,但看起来当引用公开这些依赖项时引用引用的依赖项的规则仍然适用于显式接口(interface)实现。我之前回答过几个关于这个的问题here .

更好的解决方案是支持组合而不是继承,并在程序集 B 不公开的内部类中定义 IHasData 的实现。沿着这些线的东西:

  public abstract class ClassB
{
class HasData : IHasData
{
HasData(ClassB b) {m_b = b;}
Data IHasData.GetData() { m_b.GetData(); }
}

private readonly HasData m_hasData;

public ClassB() {
m_hasData = new HasData(this);
}

internal Data GetData() {
/** do something internal **/
}
}

关于c# - 在 "friend"程序集中隐藏内部接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2926375/

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