gpt4 book ai didi

c# - 限制对需要从另一个程序集分配的属性的访问的正确方法是什么?

转载 作者:太空狗 更新时间:2023-10-30 00:53:53 25 4
gpt4 key购买 nike

例如,我在程序集 A 中定义了以下代码:

public abstract class Message
{
public int ID { get; internal set; }
public Message Parent { get; internal set; }
}

在程序集 B 中,我需要执行以下操作:

instanceOfMessage.ID = MethodToGetUniqueIDNumber();
instanceOfMessage.Parent = MethodToGetParent(); // Returns null /w no parent

目前,我正在使用 InternalsVisibleTo解决这个问题的编译器选项:

[assembly:InternalsVisibleTo ("AssemblyB")]

// Namespace stuff here

public class Message
{
public int ID { get; internal set; }
}

为了使这项工作不得不搞乱编译器选项,感觉有点讨厌。所以,我的问题是:

  • 在这种情况下可以使用 InternalsVisibleTo 吗?
  • 我是否应该只公开属性(property)并希望没有人改变任何东西?
  • 我真的应该这样做吗?

我的最终目标是有人(可能只有我和我的团队)应该能够使用 Message,但强制要求 ID 等属性永远不会从管理它们的类之外更改。但是,我们仍然需要成为创建消息实例等的人。

我的最终目标是我和我的团队应该能够在第三个程序集程序集 C 中继承 Message。程序集 C 只知道程序集 A。程序集 B 稍后会动态加载。 C将使用A提供的接口(interface)向B发送消息。

最佳答案

My end goal is that someone, likely just my team and I, should be able to use a Message, but enforce that properties like ID never get changed from outside the classes that manage them. However, we still need to be the ones to create the instances of the messages and such.

在这种情况下,一种常见的方法是为消息实际使用一个接口(interface),然后在 AssemblyB 中实现该接口(interface)。

这允许您创建消息,但以后不能修改,因为您仍然可以完全控制实现。

public interface IMessage
{
int ID { get; }
IMessage Parent { get; }
}

然后您的其他程序集可以使用私有(private)类实现它,并返回适当的消息,而不用担心它会被修改。

关于c# - 限制对需要从另一个程序集分配的属性的访问的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14816815/

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