提问人:sbi 提问时间:8/27/2009 最后编辑:sbi 更新时间:8/28/2009 访问量:1021
如何从另一个程序集中的内部接口派生
How to derive from an internal interface in another assembly
问:
我是 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++ 中,我会交一个朋友并完成。我知道 C# 没有朋友(双关语不是故意的,而是注意到的),所以我不得不凑合着过日子。我读到有一个属性,但这将使整个程序集 A
可供整个程序集 B
访问,我不喜欢。有没有办法避免这种情况?B
答:
事实上,您被误导了 - C#/.NET 确实支持友元程序集。您希望将两个程序集标记为友元程序集,MSDN 将其定义如下:
可以从另一个程序集访问程序集中的内部类型或内部成员。
因此,只需将以下属性放在项目的某个代码文件中的任何位置(我会选择)。AssemblyInfo.cs
[assembly:InternalsVisibleTo("name_of_friend_assembly")]
评论
可以使用 InternalsVisibleToAttribute
评论
A
B
这里最大的问题是让程序集 B 看到程序集 A 的一个特定成员。
根据重申原始问题部分的评论,这否定了使用有据可查的属性的可行性。InternalsVisibleTo
或者是吗?
您是否考虑过创建一个新的程序集 C,其中标记了接口并将其自己的属性输出到 A 和 B?IB
internal
InternalsVisibleTo
这至少以一种可控的方式暴露了 IB,而不会将所有 A 暴露给 B。我不是这个解决方案的忠实粉丝(我个人会按照建议继续在 A 上使用,然后记录我的其余内部结构以让其他人保持一致),但我理解你来自哪里——这至少解决了问题。InternalsVisibleTo
评论