2012-01-15 43 views
0

我想通過.InvokeMember設置屬性,但需要投放時,我不能做到這一點,錯誤InvokeMember的SetProperty與鑄造

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

真的是這樣,你正在與測試的代碼?我問你是因爲你把字段/屬性設爲空,而B是一個類,當'T'是一個類時,你不能有'Nullable '。 – 2012-01-15 11:23:43

+0

這是結構,對不起。 – AliRezza 2012-01-15 11:35:33

回答

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 }); 
+0

對不起,你是對的,它是結構。 – AliRezza 2012-01-15 11:34:40