gpt4 book ai didi

.net - 是否有通配符排序功能使内部结构对与公共(public)程序集名称匹配的程序集可见?

转载 作者:行者123 更新时间:2023-12-01 19:28:26 25 4
gpt4 key购买 nike

是否有一种通配符功能,可以使共享公共(public)程序集主要名称(我的英语能力让我失望)的程序集可见其内部结构?

例如,The.Empire 是所有程序集的主名称。我尝试了The.Empire.*,但没有成功。

装配A

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("The.Empire.*")]


namespace The.Empire
{
internal static class Constants
{
internal readonly static string CommonId = "Luke";
}
}

装配B

namespace The.Empire.Strikes
{
public class Mate
{
public void AccessSomething()
{
Console.WriteLine("{0}", Constants.CommonId); // inaccessible
}
}
}

装配C

namespace The.Empire.Back
{
public class Mate
{
public void AccessSomething()
{
Console.WriteLine("{0}", Constants.CommonId); // inaccessible
}
}
}

这可能吗?在 OOP 继承类比中,类似于 protected,只有派生者才能访问 protected

如果我将特定的程序集名称放在InternalsVisibleTo 上,则不是松散耦合。除非我重新编译 AssemblyA,否则无法满足程序集 A 的其他实现者的需求

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("The.Empire.Strikes")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("The.Empire.Back")]

最佳答案

The documentation建议指定多个程序集的唯一方法是使用多个属性或在单个属性中使用多个名称:

You can define multiple friend assemblies in two ways. They can appear as individual assembly-level attributes ... [or they] can also appear with separate InternalsVisibleToAttribute tags but a single assembly keyword.

即:

[assembly:InternalsVisibleTo("Friend1a")]
[assembly:InternalsVisibleTo("Friend1b")]

或者:

[assembly:InternalsVisibleTo("Friend2a"), 
InternalsVisibleTo("Friend2b")]

我认为你想要的东西是不可能的,而且很可能是故意的。让你的内部结构对另一个程序集可见是应该谨慎使用的事情,因为它允许比其他情况下更多的耦合。因此,除非您绝对希望将内部结构展示给给定的程序集,否则很难展示您的内部结构。通配符积极反对这一点。

您的最佳选择(如果您不想使用多个属性)是 a) 合并程序集,以便它们可以自然地共享内部或 b) 使某些关键 internal 成员public(或protected)并使它们成为其他程序集的集成点。

关于.net - 是否有通配符排序功能使内部结构对与公共(public)程序集名称匹配的程序集可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7034923/

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