动态方法访问修饰符

时间:2016-08-09 19:39:12

标签: c# access-modifiers

我想限制对方法的访问,具体取决于传入的类型。在我的特殊情况下,如果你愿意,我正在开发一个UDP“管理器”。

我希望我的UDPManager用于不同的事情。例如,我可能有1 UDPManager用于客户端和服务器之间的通信,另一个UDPManager用于处理服务器和另一台服务器之间的通信。

我已经定义了一个enum,它指定了UDPManager的类型。例如,ManagerType.A = 1和...... ManagerType.B = 2

UDPManager有一些可以订阅的事件,如果这些事件不相关,我不希望它们可用,给定UDPManager的类型。

这是一个类

的示例
public class Something
{
    public int SomethingsType { get; set; }
    public void A() { }
    public void B() { }
}

我怎样才能这样做,如果SomethingsType == MessageType.A,那么MessageType.B不可用(即它是私有的)?

为了进一步说明,如果我输入:

Something something = new Something();
someting.SomethingsType = 1

我不希望something.B()可用。

更新

我为提及runtime而道歉。我的意思是,如果BSomethingsType,我不希望所述方法(A)可用。

2 个答案:

答案 0 :(得分:1)

救援界面:

public interface IUdpManagerA
{
    void A();
}

public interface IUdpManagerB
{
    void B();
}

public class UdpManager : IUdpManagerA, IUdpManagerB
{
    public void A() { }
    public void B() { }             
}

public class UdpManagerFactory
{
     private UdpManager Create() => new UdpManager();
     public IUdpManagerA CreateOfA() => Create();
     public IUdpManagerB CreateOfB() => Create();
}

UdpManagerFactory factory = new UdpManagerFactory();
IUdpManagerA a = factory.CreateOfA();
IUdpManagerB b = factory.CreateOfB();

接口是发布某些成员的强大工具,而其他成员可以保持隐藏。

虽然您可能会说是的,但您可以随时将IUdpManagerA转换为IUdpManagerB,反之亦然,以获取对隐藏成员的访问,我的答案是**这不是不安全,因为IUdpManagerA也没有实现IUdpManagerB,反之亦然。

哦,我忘了提到你应该丢弃ManagerType枚举,因为使用接口你总是可以检查给定的实例是 A 还是

object instance = factory.CreateA();

if(instance is IUdpManagerA)
{
}

if(instance is IUdpManagerB)
{
}

或使用as运算符:

object instance = factory.CreateA();
IUdpManagerA a = instance as IUdpManagerA;
IUdpManagerB b = instance as IUdpManagerB;

if(a != null)
{
} 
else if(b != null)
{
}

答案 1 :(得分:0)

这是基于枚举的工厂构建方法的 extreme 简单版本:

    public enum ManagerType
    {
        A,B
    }

    public abstract class UDPManager
    {

    }

    public class SomethingA : UDPManager
    {
        public void A()
        {}
    }

    public class SomethingB : UDPManager
    {
        public void B()
        {}
    }

    public class UdpManagerFactory
    {
        public UDPManager Build(ManagerType type)
        {
            if (type == ManagerType.A)
                return new SomethingA();

            if(type == ManagerType.B)
                return new SomethingB();

            throw new Exception("type not found");
        }
    }