C#隐式转换“重载”和reflection问题

我有以下代码的问题(编译但崩溃):

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace ConsoleApplication1 { public struct MyBoolean { public bool Value { get; set; } //cast string -> MyBoolean public static implicit operator MyBoolean(System.String value) { return new MyBoolean() { Value = (value[0] == 'J') }; } //cast bool -> MyBoolean public static implicit operator MyBoolean(bool value) { return new MyBoolean() { Value = value }; } //cast MyBoolean -> bool public static implicit operator bool(MyBoolean value) { return value.Value; } } public class Foo { public MyBoolean TestProp { get; set; } } class Program { static void Main(string[] args) { MyBoolean myBool = true; //works myBool = "N"; //works Foo foo = new Foo(); foo.TestProp = "J"; //works PropertyInfo pi = foo.GetType().GetProperty("TestProp"); var obj = Convert.ChangeType("J", typeof(MyBoolean)); //throws an InvalidCastException pi.SetValue(foo, "J", null); //throws an ArgumentException } } } 

我评论了那些不起作用的陈述。 有谁知道为什么Convert.ChangeType和PropertyInfo.SetValue似乎没有使用MyBoolean中定义的“重载”强制转换运算符?

顺便说一句,我一直在浏览其他几个文档,但没有找到问题的完全匹配。

最好的问候Thomas

Convert.ChangeType()不使用隐式运算符。 你需要让你的MyBoolean类型实现IConvertible

第二个问题是相关的。 不使用用户定义的转换运算符。 在将其传递给SetValue()之前,您需要手动转换它。

尝试实施IConvertible 。 Convert将您的实例强制Convert为该接口,以尝试执行转换。

至于PropertyInfo.SetValue,它获取属性的Set方法。 当通过reflectionAFAICT调用此方法时,将按类型检查参数,而不是隐式转换为正确类型的能力。 必须在调用之前执行此强制转换。