gpt4 book ai didi

c# - 在编译时限制方法访问的最佳方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 21:21:07 24 4
gpt4 key购买 nike

假设我有一个 Manager 类

public class Manager {
public Item Create() {
...
return new Item(...);
}
}

我有一个 Item 类:

public class Item {
[AllowCallBy(typeof(Manager))]
public Item(...) {
}
...
}

现在,我想用最简单直接的方式在编译时分析AllowCallBy等属性,并显示错误或警告。如果在这种特殊情况下,管理器类以外的类试图用 new Item(...) 实例化 Item 我想显示类似“不要直接实例化 Item 类,改为调用 Manager.Create(...)。

我想至少有一个系统:Roslyn、ReSharper、PostSharp 或其他系统可以让我做到这一点或与我想要实现的目标非常接近的系统。有人可以举例说明使用什么以及如何使用它吗?

最佳答案

这绝对是一个 code smell正如@Habib 提到的(有人可以链接到特定的链接吗?),但如果没有更完整的示例,就很难提供超出评论中建议的替代方案。我鼓励您扩大样本或重新考虑您的设计。


但是,我可以提供一个我过去使用过的选项,但不是为了这个目的。您可以将 Item 的构造函数标记为 Obsolete :

public class Item {
[Obsolete("Don't instantiate Item class directly, call Manager.Create(...) instead")]
public Item(...) {
}
...
}

然后在您的 Manager 类中,您将在调用构造函数时特别忽略此警告:

public class Manager {
public Item Create() {
...
#pragma warning disable 618
return new Item(...);
#pragma warning restore 618
}
}

这样,每当有人试图在代码的其他地方创建他们自己的 Item 时,他们都会得到一个 level 2 CS0618 warning表示他们不应该使用该方法(注意我没有说不能)与属性中输入的文本完全相同。如果warnings as errors已启用(对于所有警告或仅此警告),那么它将是您最初想要的编译错误。

请注意,没有什么可以阻止其他人添加这些 pragma 语句来绕过错误。但是,使用这种方法,开发人员不能说他们不知道他们不应该使用构造函数。

关于c# - 在编译时限制方法访问的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30623687/

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