带强制转换的InvokeMember SetProperty中出错

本文关键字:SetProperty 出错 InvokeMember 转换 | 更新日期: 2023-09-27 18:20:25

我想通过.InvokeMember设置属性,但当需要强制转换时我不能这样做,

public Class A{
  private B? _bb;
  public B? Bb{
    get{return _bb;}
    set {_bb=value;}
  }
}

public struct B {
  public B(int i){}
  public static implicit operator B(int p)
        {   B q = new B(p);
            return q;
        }
}

当我通过简单代码设置它时,它就起作用了。

A myA=new A();
myA.Bb=12;

但当我尝试通过InvokeMember设置它时,它不适用于强制转换,它只适用于直接类型。

该代码适用于

A myA=new A();
myA.GetType().InvokeMember("Bb", 
   BindingFlags.SetProperty, null,myA, new object[] { new B(12) });

但下一行,给出了错误,并表示找不到属性"Bb"

A myA=new A();
myA.GetType().InvokeMember("Bb", 
   BindingFlags.SetProperty, null,myA, new object[] { 12});

我必须用最后一种方法,我该怎么做?

带强制转换的InvokeMember SetProperty中出错

这甚至不会编译。B是引用类型,因此不能将其用作Nullable<T>类的泛型参数:

// Impossible
private B? _bb;

话虽如此,假设您修复了代码并将B声明为值类型(例如使用struct),问题是Reflection不使用隐式转换运算符。

您可以查看下面的线程以获得一个可能的解决方案。

另一种可能性是调用编译器发出的op_Implicit静态方法,将整数转换为B:的实例

A myA = new A();
var op_Implicit = typeof(B).GetMethod("op_Implicit");
B myB = (B)op_Implicit.Invoke(null, new object[] { 12 });
myA.GetType().InvokeMember("Bb", BindingFlags.SetProperty, null, myA, new object[] { myB });