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

时间:2013-02-11 16:50:27

标签: c# .net

例如,我在程序集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吗?
  • 我应该公开财产并希望没有人改变吗?
  • 我甚至应该这样做吗?

我的最终目标是某个人,可能只是我和我的团队,应该能够使用消息,但强制执行像ID这样的属性永远不会从管理它们的类之外进行更改。但是,我们仍然需要创建消息实例等。

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

3 个答案:

答案 0 :(得分:5)

  

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

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

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

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

然后你的另一个程序集可以用私有类实现它,并返回相应的消息,而不用担心它可以被修改。

答案 1 :(得分:1)

为什么不在调用构造函数时使用private set并定义IDParent

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());    

现在我可以完全控制对象实例的创建,一旦创建它就无法修改。