[英]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
我深表歉意。 我的意思是,如果所說的SomethingsType
為A
,我不希望所說的方法( 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();
界面是發布某些成員而其他成員可以隱藏的強大工具。
雖然您可能會說是的,但是您始終可以將IUdpManagerA
為IUdpManagerB
,反之亦然,以獲取對隱藏成員的訪問權限 ,我的回答是**這是不安全的,因為沒有任何線索表明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.