2016-08-09 22 views
0

渡された型に応じて、メソッドへのアクセスを制限したいと思います。私の特定の状況では、もしあなたがそうするなら、私はUDP「マネージャ」を開発しています。動的メソッドのアクセス修飾子

私はUDPManagerを別のものに使用します。たとえば、クライアントとサーバー間の通信に1 UDPManager、サーバーと別のサーバー間の通信を処理する別のサーバーUDPManagerがあります。

enumのタイプを指定してUDPManagerと定義しました。したがって、たとえば、ManagerType.A = 1と... ManagerType.B = 2

UDPManagerUDPManagerの種類与えに加入することができ、これらのイベントが関連していない場合、私は彼らが利用可能たくない特定のイベントを、持っています。

ここ

がクラスの一例である

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

SomethingsType == MessageType.A場合、MessageType.Bは(それがプライベートでIE)利用できないように、どのように私はそれを行うことができますか?さらに明確にするために

、私が入力した場合:

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

私はsomething.B()が利用可能になりたくありません。

UPDATE

私はruntimeを言及をお詫び申し上げます。つまり、SomethingsTypeAの場合、上記の方法(B)を使用したくないということです。

+1

非公開であっても、常にリフレクトでメソッドを呼び出すことができます。 – Steve

+0

そのことはコンパイラによって強制されます。実行時に無意味です。あなたの考えでは、「利用できません(つまり、それはプライベートです)」とは実行時に*を意味しますか?コンパイラが 'something.B()'を呼び出すコードをコンパイルすると(ソースファイルには公開されているため)、突然メソッドがプライベートになると、何が起こると思いますか? –

+3

'SomethingA'、' SomethingB'などを実装します。次に、 'ManagerType'を指定してファクトリメソッドを使います。 – mxmissile

答えて

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

インタフェースは、特定のメンバーを公開するための強力なツールです他は隠れたままにすることができます。

IUdpManagerAIUdpManagerBを実装することを何も手がかりがありませんので、これは安全ではありません**あなたはええを言うかもしれないが、あなたは常に隠されたメンバーへのアクセスを得るためにIUdpManagerBとその逆にIUdpManagerAをキャストすることができますし、私の答えですがおよびその逆。

ああ、私は特定のインスタンスがBであればインターフェースで、いつでも確認することができますので、あなたが、ManagerType列挙を捨てる必要があることを言及するのを忘れてしまった:

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

ありがとうございます!これは素晴らしい。このデザインパターンとは何ですか? – pookie

+0

@pookieファクトリメソッドhttps://en.wikipedia.org/wiki/Factory_method_pattern –

+0

@MatiasFidermraizer素晴らしい、ありがとう! – pookie

0

これは、列挙型のベースと工場出荷時のビルド方法の極端簡易版である:救助へ

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

ありがとうございます!私はこの方法もうまくいくと思っていますが、マティアスの答えがより適切であると感じています。 – pookie

関連する問題