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

c# – 动态线程和运算符重载,第1张

概述考虑下面的代码: var vectorTest = new Vector2(1, 2) + new Vector2(3, 4); // Worksvar x = Expression.Parameter(typeof(Vector2), "x");var test = System.Linq.Dynamic .DynamicExpression.ParseL 考虑下面的代码:
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");

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

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);}
总结

以上是内存溢出为你收集整理的c# – 动态线程和运算符重载全部内容,希望文章能够帮你解决c# – 动态线程和运算符重载所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1237591.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存