如何检查泛型是否具有运算符?C# [英] How to check if a generic has an operator? C#

查看:52
本文介绍了如何检查泛型是否具有运算符?C#的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想为通用类重载运算符+(f,s).如果f和s具有加号运算符,则应返回+(f,s),否则返回null.我该怎么办?

I want to overload operator +(f,s) for a generic class. It should return +(f,s) if f and s have plus operator and null otherwise. How can I do it?

public class param<T> : TDefault 
{
    public string param_name;
    public T cnt;
    public param(T _cnt)
    {
        cnt=_cnt;
    }
    public static param<T> operator +(param<T> f, param<T> s)
    {
        if(T ? has_operator("+"))
            return param<T>(((f.cnt as ?)+(s.cnt as ?)) as T);
        return null;
    }
}

我尝试检查操作员是否存在

For checking operator existence I tried

public static bool has_method(this object target,string method_name)
{
    return target.GetType().GetMethod(method_name)!=null;
}

但是

int x;
print (x.has_method("+="));

打印'false'

推荐答案

尝试一下:

public class Param<T>
{
    private static readonly Func<T, T, T> addMethod;
    static Param()
    {
        try
        {
            ParameterExpression left = Expression.Parameter(typeof (T), "left");
            ParameterExpression right = Expression.Parameter(typeof (T), "right");
            addMethod = Expression.Lambda<Func<T, T, T>>(Expression.Add(left, right), left, right).Compile();
        }
        catch (InvalidOperationException)
        {
            //Eat the exception, no + operator defined :(
        }
    }

    public string param_name;
    public T cnt;
    public Param(T _cnt)
    {
        cnt = _cnt;
    }

    public static Param<T> operator +(Param<T> leftOperand, Param<T> rightOperand)
    {
        if (addMethod != null)
        {
            return new Param<T>(addMethod(leftOperand.cnt, rightOperand.cnt));
        }
        return null;
    }
}

private static void Main(string[] args)
{
    var pi = new Param<int>(5);
    var pi2 = new Param<int>(6);
    var pi3 = pi + pi2;

    var pi4 = new Param<ooject>(5);//Wont work
    var pi5 = new Param<object>(6);
    var pi6 = pi4 + pi5;
}

信用归JonSkeet和Marc

这篇关于如何检查泛型是否具有运算符?C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆