Ich habe ein Problem mit dem folgenden Code bekommen (die aber Abstürze kompilieren):C# implizite Umwandlung „Überlastung“ und Reflexion Problem
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
}
}
}
Ich habe die Aussagen kommentiert, die nicht funktionieren. Weiß jemand, warum Convert.ChangeType und PropertyInfo.SetValue nicht den "überladenen" Darstellungsoperator zu verwenden scheint, wie in MyBoolean definiert?
Übrigens habe ich hier schon einige andere Dokumente durchgelesen, aber ich fand keine genaue Übereinstimmung des Problems.
Mit freundlichen Grüßen Thomas
danke, siride für Ihre Erklärung. Jetzt habe ich meine Requisiten zurück auf bool (von MyBoolean) geändert und sie mit Attributen versehen, so dass ich diese Requisiten vor dem Aufruf von SetValue manuell vorspielen kann. – Thomas
Stellen Sie sicher, dass Sie meine Antwort dann als die richtige auswählen. – siride