gpt4 book ai didi

c# - 如何检查泛型是否有运算符? C#

转载 作者:行者123 更新时间:2023-11-30 17:48:12 25 4
gpt4 key购买 nike

我想为泛型类重载运算符 +(f,s)。如果 f 和 s 有加号运算符,它应该返回 +(f,s),否则返回 null。我该怎么做?

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;
}
}

我试过检查运算符是否存在

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

但是

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

打印“假”

最佳答案

试试这个:

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;
}

Credit goes to JonSkeet and Marc

关于c# - 如何检查泛型是否有运算符? C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23404620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com