簡體   English   中英

動態方法訪問修飾符

[英]Dynamic method access modifier

我想根據傳入的類型來限制對方法的訪問。在我的特殊情況下,如果您願意,我正在開發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我深表歉意。 我的意思是,如果所說的SomethingsTypeA ,我不希望所說的方法( B )可用。

救援接口:

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

界面是發布某些成員而其他成員可以隱藏的強大工具。

雖然您可能會說是的,但是您始終可以將IUdpManagerAIUdpManagerB ,反之亦然,以獲取對隱藏成員的訪問權限 ,我的回答是**這是不安全的,因為沒有任何線索表明IUdpManagerA也實現了IUdpManagerB ,反之亦然。

哦,我忘了提起您應該丟棄ManagerType枚舉,因為使用接口,您始終可以檢查給定實例是A還是B

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)
{
}

這是基於枚舉的工廠構建方法的極其簡單的版本:

    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");
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM