我想通过.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});
我必须通过最后一种方式使用它,我该怎么做呢?
答案 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 });