例如,我在程序集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; }
}
为了让这项工作变得混乱,不得不乱用编译器选项。所以,我的问题是:
我的最终目标是某个人,可能只是我和我的团队,应该能够使用消息,但强制执行像ID这样的属性永远不会从管理它们的类之外进行更改。但是,我们仍然需要创建消息实例等。
我的最终目标是我的团队和我应该能够在第三个程序集中继承Message,程序集C.程序集C只知道程序集A.程序集B稍后会动态加载。 C将使用A提供的接口向B发送消息。
答案 0 :(得分:5)
我的最终目标是某个人,可能只是我和我的团队,应该能够使用消息,但强制执行ID之类的属性永远不会从管理它们的类之外进行更改。但是,我们仍然需要创建消息实例等。
在这种情况下,一种常见的方法是实际使用消息接口,然后在AssemblyB中实现接口。
这允许您创建消息,但以后不会修改,因为您仍然可以完全控制实现。
public interface IMessage
{
int ID { get; }
IMessage Parent { get; }
}
然后你的另一个程序集可以用私有类实现它,并返回相应的消息,而不用担心它可以被修改。
答案 1 :(得分:1)
为什么不在调用构造函数时使用private set
并定义ID
和Parent
?
public class Message
{
public Message(int id, Message parent) // Message constructor taking in ID and parent from external
{
ID = id;
Parent = parent;
}
public int ID { get; private set; }
public Message Parent { get; private set; }
}
以下来自Message
课程以外的电话。
Message instanceOfMessage = new Message(MethodToGetUniqueIDNumber(), MethodToGetParent());
答案 2 :(得分:0)
我可能会更进一步,创建一个静态工厂方法:
public class Message
{
public static Message CreateInstance(int id, Message parent)
{
// Add code here to check security of caller
return new Message(id, parent);
}
private Message(int id, Message parent)
{
ID = id;
Parent = parent;
}
public int ID { get; private set; }
public Message Parent { get; private set; }
}
要创建您现在要调用的消息实例:
Message instanceOfMessage = Message.CreateInstance(MethodToGetUniqueIDNumber(), MethodToGetParent());
现在我可以完全控制对象实例的创建,一旦创建它就无法修改。