带有强制转换的InvokeMember SetProperty中的错误

时间:2012-01-15 11:21:47

标签: c# c#-4.0 pinvoke

我想通过.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});

我必须通过最后一种方式使用它,我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

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

// Impossible
private B? _bb;

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

您可以查看following thread的一种可能解决方案。

另一种可能性是调用编译器发出的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 });