C#隐式转换"重载"和反射问题

Tho*_*mas 3 c# reflection implicit-cast

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

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

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

最好的问候托马斯

sir*_*ide 8

Convert.ChangeType()不使用隐式运算符.您需要拥有MyBoolean类型的实现IConvertible.

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