我是C#新手,所以请耐心等待。
好的,所以我在不同的程序集中有两个需要互相引用的类:
namespace AssemblyA
{
class A
{
private B MyB { get; set; }
}
}
namespace AssemblyB
{
class B
{
private A MyA { get; set; }
}
}
我知道不允许循环引用,所以我使用的是接口:
namespace AssemblyA
{
public interface IB
{
// whatever 'A' needs of 'B'
}
class A
{
private IB MyB { get; set; }
}
}
namespace AssemblyB
{
class B : AssemblyA.IB
{
private A MyA { get; set; }
}
}
这有效,但它的缺点是它会向世界其他地方公开IB
。我想要做的是IB
internal
。但是B
无法从中获得。
在C ++中,我会让B
成为朋友并完成。我知道C#没有朋友(双关语没有意图,但是注意到了),所以我必须做不到。 我已经读过有一个属性,但这会使整个程序集A
对整个程序集B
都可访问,我不喜欢这样。有没有办法避免这种情况?
答案 0 :(得分:8)
你实际上被误导了 - C#/ .NET确实支持朋友集会。您希望将两个程序集标记为Friend Assemblies,MSDN将其定义为:
可以从另一个程序集访问程序集中的内部类型或内部成员。
因此,只需将以下属性放在项目中的一个代码文件中(我会选择AssemblyInfo.cs
)。
[assembly:InternalsVisibleTo("name_of_friend_assembly")]
答案 1 :(得分:4)
这里似乎最大的问题是让装配B看到装配A的一个特定成员。
根据重复原始问题部分的评论,这否定了使用记录良好的InternalsVisibleTo
属性的可行性。
或者是吗?
您是否考虑使用标记为IB
的{{1}}接口及其自己的internal
属性向A和B创建新的程序集C?
这至少以受控制的方式暴露IB,而不会暴露所有的A到B.我不是解决方案的忠实粉丝(我个人会继续在A上使用InternalsVisibleTo
建议,然后记录我的其余内部以保持其他人在一起),但我知道你来自哪里 - 这至少解决了这个问题。
答案 2 :(得分:1)
您可以使用InternalsVisibleToAttribute