我想要獲取特定類型的已定義的運算符的列表,以查看可以應用於該類型的操作類型。如何獲得一個類型中定義的運算符.net
例如,類型的Guid支持操作==和!=。
因此,如果用戶想要應用< =對於Guid類型,我可以在發生異常之前處理這種情況。
或者如果我有運營商列表,我可以強制用戶只使用列表中的操作。
在對象瀏覽器中看到運算符,因此可能有一種方法可以通過反射訪問它們,但我找不到這種方式。
任何幫助將不勝感激。
我想要獲取特定類型的已定義的運算符的列表,以查看可以應用於該類型的操作類型。如何獲得一個類型中定義的運算符.net
例如,類型的Guid支持操作==和!=。
因此,如果用戶想要應用< =對於Guid類型,我可以在發生異常之前處理這種情況。
或者如果我有運營商列表,我可以強制用戶只使用列表中的操作。
在對象瀏覽器中看到運算符,因此可能有一種方法可以通過反射訪問它們,但我找不到這種方式。
任何幫助將不勝感激。
獲取方法與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);
}
}
}
}
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());
}
}
}
嗨,感謝您的快速回復! 我認爲這適用於大多數類型,但當我嘗試Int32時,它返回一個空集。 有什麼建議嗎? – Cankut 2009-09-11 19:26:55
是的,原始類型的操作符是這樣的「有趣」。我懷疑你基本上不得不對它們進行硬編碼。不要忘記,基元不包括'decimal','DateTime','TimeSpan或'Guid'。 – 2009-09-11 19:28:59
非常感謝:) – Cankut 2009-09-11 19:30:48