我有两个类型,T和U,我想知道是否从T到U定义了隐式强制转换操作符。
我知道IsAssignableFrom的存在,但这不是我要找的,因为它不处理隐式强制转换。
我在谷歌上搜索了一下,找到了this solution,但用作者自己的话说,这是一段丑陋的代码(它试图隐式地强制转换,如果有异常,则返回false,否则返回true ......)
它似乎在测试是否存在具有正确签名won't work for primitive types的op_Implicit方法。
有没有更干净的方法来确定隐式强制转换运算符的存在?
4条答案
按热度按时间fnatzsnv1#
可以使用反射来查找目标类型的隐式转换方法:
您可以像这样使用它:
注意,这只检查基类型(第一个传递的类型)上的隐式类型转换。从技术上讲,类型转换也可以定义在另一个类型上,所以您可能需要用相反的类型再次调用它(或将其构建到方法中)。隐式类型转换可能不存在于两个类型上。
8ftvxx2r2#
我最终手动处理了原始类型场景。不是很优雅,但它很有效。
我还添加了额外的逻辑来处理可空类型和枚举。
我在用户定义类型场景中重用了Poke's code。
syqv5f0l3#
Here's是我找到的一个解决方案。主要代码如下所示(经过一些简单的翻译):
更新:Here's整个文件。
zpgglvta4#
虽然Brann's solution适用于许多情况,但它没有考虑对非基元类型的隐式强制转换的级联影响。
例如:将一个float赋值给一个Thickness(它有一个从double隐式转换而来的)应该返回true。我重写了代码来处理类似的情况。