2009-09-11 68 views
6

我想要獲取特定類型的已定義的運算符的列表,以查看可以應用於該類型的操作類型。如何獲得一個類型中定義的運算符.net

例如,類型的Guid支持操作==!=

因此,如果用戶想要應用< =對於Guid類型,我可以在發生異常之前處理這種情況。

或者如果我有運營商列表,我可以強制用戶只使用列表中的操作。

在對象瀏覽器中看到運算符,因此可能有一種方法可以通過反射訪問它們,但我找不到這種方式。

任何幫助將不勝感激。

回答

10

獲取方法與Type.GetMethods,然後用MethodInfo.IsSpecialName發現運營商,轉換等。下面是一個例子:

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

嗨,感謝您的快速回復! 我認爲這適用於大多數類型,但當我嘗試Int32時,它返回一個空集。 有什麼建議嗎? – Cankut 2009-09-11 19:26:55

+2

是的,原始類型的操作符是這樣的「有趣」。我懷疑你基本上不得不對它們進行硬編碼。不要忘記,基元不包括'decimal','DateTime','TimeSpan或'Guid'。 – 2009-09-11 19:28:59

+0

非常感謝:) – Cankut 2009-09-11 19:30:48

4

C#4.0具有動態語言運行庫的功能,如何使用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()); 
    } 
} 
} 
相關問題