加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 动态线程和运算符重载

发布时间:2020-12-15 17:51:10 所属栏目:百科 来源:网络整理
导读:考虑下面的代码: var vectorTest = new Vector2(1,2) + new Vector2(3,4); // Worksvar x = Expression.Parameter(typeof(Vector2),"x");var test = System.Linq.Dynamic .DynamicExpression.ParseLambda(new[] { x },null,"x = x + x"); 运行它,我得到以下
考虑下面的代码:
var vectorTest = new Vector2(1,2) + new Vector2(3,4); // Works

var x = Expression.Parameter(typeof(Vector2),"x");
var test = System.Linq.Dynamic
                 .DynamicExpression.ParseLambda(new[] { x },null,"x = x + x");

运行它,我得到以下异常:

System.Linq.Dynamic.ParseException was unhandled by user code
Message=Operator ‘+’ incompatible with operand types ‘Vector2’ and ‘Vector2’
Source=DynamicLINQ
Position=6

如何让解析器看到Vector2类型的操作符重载?

编辑:我也得到与=运算符相同的问题.
看看源码,我可以看到为什么,它看到一个特殊的界面,列出了方法的大量,对于简单的类型,如果它找不到它,那么它引发了异常.麻烦的是,我的类型(Vector2)不在列表中,所以它不会找到操作符的方法.

解决方法

使用DynamicLinq库,您需要将签名添加到System.Linq.Dynamic.ExpressionParser中的一个签名接口中.它只会解析它识别的操作.

看来它将会看到在ExpressionParser中发现的所有私有接口.只需在ExpressionParser中添加一个接口,并且似乎可以抑制错误.

interface ICustomSignatures
{
    void F(Microsoft.Xna.Framework.Vector2 x,Microsoft.Xna.Framework.Vector2 y);
}

为了安全(并且可能符合预期的模式),从IAddSignatures界面添加/扩展可能更安全.

interface ICustomSignatures : IAddSignatures
{
    void F(Microsoft.Xna.Framework.Vector2 x,Microsoft.Xna.Framework.Vector2 y);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读