2009-09-11 6 views
6

J'essaie d'obtenir la liste des opérateurs définis pour un type spécifique afin de voir quel type d'opérations peut être appliqué à ce type.Comment obtenir des opérateurs définis pour un type .net

Par exemple, le type Guid prend en charge les opérations == et ! =.

Donc si l'utilisateur veut appliquer < = opération pour un type de guide je peux gérer cette situation avant qu'une exception se produise. Ou si je pouvais avoir la liste des opérateurs, je peux forcer l'utilisateur à n'utiliser que des opérations dans la liste.

Les opérateurs sont vus dans le navigateur d'objets, donc il peut y avoir un moyen d'y accéder par réflexion, mais je ne pouvais pas trouver de cette façon.

Toute aide sera appréciée.

Répondre

10

Obtenez les méthodes avec Type.GetMethods, utilisez MethodInfo.IsSpecialName pour découvrir les opérateurs, les conversions, etc. Voici un exemple:

using System; 
using System.Reflection; 

public class Foo 
{ 
    public static Foo operator +(Foo x, Foo y) 
    { 
     return new Foo(); 
    } 

    public static implicit operator string(Foo x) 
    { 
     return ""; 
    } 
} 

public class Example 
{ 

    public static void Main() 
    { 
     foreach (MethodInfo method in typeof(Foo).GetMethods()) 
     { 
      if (method.IsSpecialName) 
      { 
       Console.WriteLine(method.Name); 
      } 
     } 
    } 
} 
+0

salut, merci pour la réponse rapide! Je pense que cela fonctionne pour la plupart des types mais quand j'essaye Int32 il retourne un ensemble vide. une suggestion? – Cankut

+2

Oui, les opérateurs sur les types primitifs sont "drôles" comme ça. Je suppose que vous auriez à coder une liste d'entre eux, en gros. N'oubliez pas que les primitives n'incluent pas 'decimal',' DateTime', 'TimeSpan ou' Guid'. –

+0

merci beaucoup :) – Cankut

4

4,0 C# a fonction d'exécution de langage dynamique, alors que diriez-vous d'utiliser le type dynamic?

using Microsoft.CSharp.RuntimeBinder; 

namespace ListOperatorsTest 
{ 
class Program 
{ 
    public static void ListOperators(object inst) 
    { 
     dynamic d = inst; 

     try 
     { 
      var eq = d == d; // Yes, IntelliSense gives a warning here. 
      // Despite this code looks weird, it will do 
      // what it's supposed to do :-) 
      Console.WriteLine("Type {0} supports ==", inst.GetType().Name); 

     } 
     catch (RuntimeBinderException) 
     { 
     } 

     try 
     { 
      var eq = d <= d; 
      Console.WriteLine("Type {0} supports <=", inst.GetType().Name); 

     } 
     catch (RuntimeBinderException) 
     { 
     } 

     try 
     { 
      var eq = d < d; 
      Console.WriteLine("Type {0} supports <", inst.GetType().Name); 

     } 
     catch (RuntimeBinderException) 
     { 
     } 

     try 
     { 
      var add = d + d; 
      Console.WriteLine("Type {0} supports +", inst.GetType().Name); 
     } 
     catch (RuntimeBinderException) 
     { 
     } 

     try 
     { 
      var sub = d - d; 
      Console.WriteLine("Type {0} supports -", inst.GetType().Name); 
     } 
     catch (RuntimeBinderException) 
     { 
     } 

     try 
     { 
      var mul = d * d; 
      Console.WriteLine("Type {0} supports *", inst.GetType().Name); 
     } 
     catch (RuntimeBinderException) 
     { 
     } 

     try 
     { 
      try 
      { 
       var div = d/d; 
      } 
      catch (DivideByZeroException) 
      { 
      } 
      Console.WriteLine("Type {0} supports /", inst.GetType().Name); 
     } 
     catch (RuntimeBinderException) 
     { 
     } 
    } 

    private struct DummyStruct 
    { 
    } 

    static void Main(string[] args) 
    { 
     ListOperators(0); 
     ListOperators(0.0); 
     DummyStruct ds; 
     ListOperators(ds); 
     ListOperators(new Guid()); 
    } 
} 
} 
Questions connexes