C# 如何获取.net中类型的已定义运算符

C# 如何获取.net中类型的已定义运算符,c#,reflection,operators,C#,Reflection,Operators,我试图获取特定类型的已定义运算符列表,以便查看哪些类型的操作可以应用于该类型 例如,类型Guid支持操作=和= 因此,如果用户希望应用获取带有Type.GetMethods的方法,则使用MethodInfo.IsSpecialName来发现运算符、转换等。下面是一个示例: using System; using System.Reflection; public class Foo { public static Foo operator +(Foo x, Foo y) {

我试图获取特定类型的已定义运算符列表,以便查看哪些类型的操作可以应用于该类型

例如,类型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具有动态语言运行时功能,那么如何使用
动态
类型呢

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());
    }
}
}
使用Microsoft.CSharp.RuntimeBinder;
命名空间ListOperatorTest
{
班级计划
{
公共静态无效列表运算符(对象指令)
{
动态d=仪器;
尝试
{
var eq=d==d;//是的,IntelliSense在这里给出警告。
//尽管这段代码看起来很奇怪,但它也可以
//它应该做什么:-)
WriteLine(“类型{0}支持==”,inst.GetType().Name);
}
捕获(RuntimeBinderException)
{
}
尝试
{

var eq=d hi,感谢您的快速回复!我认为这适用于大多数类型,但当我尝试Int32时,它返回一个空集。有什么建议吗?是的,基本类型上的运算符很“有趣”像那样。我想你基本上必须硬编码它们的列表。别忘了,原语不包括
十进制
日期时间
时间跨度或
Guid`。为了完整起见,
可空
上的“提升”运算符也可以称为“有趣”;-p