2012-05-21 12 views
3

我有一個假裝是int的類,所以它重載了各種運算符;如何在使用Reflection.SetValue時提供轉換?

public class MyId 
{ 
    int value; 
    public virtual int Value 
    { 
     get { return this.value; } 
     set { this.value = value; } 
    } 

    public MyId(int value) 
    { 
     this.value = value; 
    } 


    public static implicit operator MyId(int rhs) 
    { 
     return new MyId(rhs); 
    } 

    public static implicit operator int(MyId rhs) 
    { 
     return rhs.Value; 
    } 


} 

然而,當我使用像

PropertyInfo.SetValue(myObj, 13, null) 
OR 
MyId myId = 13; 
int x = Convert.ToInt32(myId); 
IConvertible iConvertible = x as IConvertible; 
iConvertible.ToType(typeof(MyId), CultureInfo.CurrentCulture); 

我得到無效的轉換代碼。我感到困惑,這兩個調用似乎試圖調用int上的轉換,因爲int不理解類型MyId(即使所有的賦值操作符都在那裏)。任何想法的解決辦法,我敢肯定我必須失去一些愚蠢的東西?

+2

您是否嘗試過實施'IConvertible'? – mattytommo

+0

到目前爲止描述的內容正是Int32所做的......提供了一個圍繞本機32位整數的對象框。我假設你的用例更多,但如果不是的話,只需使用Int32即可。 –

+1

我已經在myid上完全實現了icovertable,但它看起來像是在int32上調用它,所以我不能影響它。 – pkr2000

回答

2

隱式轉換是C#構造,不可通過反射獲得。此外,通過反射來設置字段或屬性意味着您必須預先提供合適的類型。您可以嘗試通過使用自定義TypeConverter(或其他一些自定義轉換方法)來避免這種情況,以幫助在使用反射之前在運行時轉換類型。這是一個TypeConverter實現的粗略例子。

public class MyIdTypeConverter : TypeConverter 
{     
    public override object ConvertFrom(ITypeDescriptorContext context, 
             System.Globalization.CultureInfo culture, 
             object value) 
    { 
     if (value is int) 
      return new MyId((int)value); 
     else if (value is MyId) 
      return value; 
     return base.ConvertFrom(context, culture, value); 
    }    
} 

下面是我們將嘗試設置Custom屬性的類型。

public class Container 
{ 
    [TypeConverter(typeof(MyIdTypeConverter))] 
    public MyId Custom { get; set; }     
} 

的代碼來調用它會檢查屬性和執行時間提前的轉換後,它可以調用SetValue

var instance = new Container(); 
var type = typeof(Container); 
var property = type.GetProperty("Custom"); 

var descriptor = TypeDescriptor.GetProperties(instance)["Custom"]; 
var converter = descriptor.Converter;     
property.SetValue(instance, converter.ConvertFrom(15), null); 
+0

謝謝,它開始看起來像一個開銷,但這是一個很好的解決方案,再次感謝。 – pkr2000

相關問題