2017-06-05 9 views
0

を持つメソッドを取得しますServerTypeの値。したがって、私がServerType.Serverでこのメソッドを呼び出すと、属性としてServer1を含むすべてのメソッドが返されます。リフレクションを使用すると、私は、このデリゲートを持っている特定の属性値

私は今のところこれを作った:

public static IEnumerable<Doublet<PacketHandlerAttribute, PacketHandler>> GetPacketHandlers(ServerType server) 
    { 
     foreach (Type type in Assembly.GetExecutingAssembly().GetTypes()) 
     { 
      foreach (MethodInfo method in type.GetMethods()) 
      { 
       PacketHandlerAttribute attribute = (PacketHandlerAttribute)method.GetCustomAttribute(typeof(PacketHandlerAttribute)); 

       if (attribute != null) 
       { 
        if (attribute.Server == server) 
        { 
         yield return new Doublet<PacketHandlerAttribute, PacketHandler>(attribute, (PacketHandler)Delegate.CreateDelegate(typeof(PacketHandler), method)); 
        } 
       } 
      } 
     } 
    } 

を私はこれを行うための正しい方法だかどうか尋ねると思った、そしてどのようにこれはLINQを短縮することができますか?

+1

?あなたが望むものははっきりしない。 – Kyle

+0

@Kyle私はそれを確認する方法がわからないので、私はではありません。メソッドに属性が含まれているかどうかをチェックする方法は分かっていますが、 'server'引数を調べる方法がわかりません。 –

答えて

2

ここに私が役立つと思われるものがあります。あなたは `server`引数を使用している

var methods = from type in assembly.GetTypes() 
         from method in type.GetMethods() 
         let attribute = method.GetCustomAttributes(typeof(PacketHandlerAttribute), false).Cast<PacketHandlerAttribute>().FirstOrDefault() 
         where attribute?.Code == 1 
         select new { method, attribute }; 

あなたの方法

public IEnumerable<(PacketHandlerAttribute attribute, PacketHandler handler)> GetPacketHandlers(ServerType server) 
     { 
      var assembly = Assembly.GetEntryAssembly(); 

      return from type in assembly.GetTypes() 
          from method in type.GetMethods() 
          let attribute = method.GetCustomAttributes(typeof(PacketHandlerAttribute), false).Cast<PacketHandlerAttribute>().FirstOrDefault() 
          where attribute?.Server == server 
          select (attribute, (PacketHandler)method.CreateDelegate(typeof(PacketHandler))); 
     } 
+0

ありがとうございました!私は本当にlinqを使用する方法を勉強する必要があります。 –

+0

@GilbertWilliams喜んで私は助けることができました。また、あなたのメソッドを書き直し、いくつかのC#7をタプルのメソッドに追加しました。 –

関連する問題