2010-12-07 31 views
2

我想創建一個通用包裝,包裝所有類型的值提供一些額外的功能。通用包裝和isAssignableFrom不工作

的包裝看起來像:

class PropertyWrapper<T> 
{ 
    private T _value; 

    public PropertyWrapper(T value) 
    { 
     _value = value; 
    } 

    public PropertyWrapper() 
    { 
    } 

    public static implicit operator T(PropertyWrapper<T> value) 
    { 
     return value._value; 
    } 

    public static implicit operator PropertyWrapper<T>(T value) 
    { 
     return new PropertyWrapper<T>(value); 
    } 

} 

它具有隱含的轉換操作,使程序員可以使用它像他正在與包裝類型。

現在我有以下代碼:

 PropertyWrapper<Int32> wrapped = new PropertyWrapper<Int32>(); 
     Int32 unwrapped; 

     unwrapped = 42; 

     wrapped = unwrapped; //working 

     wrapped = 21; //working 

     unwrapped = wrapped; //working 

     if (wrapped.GetType().IsAssignableFrom(unwrapped.GetType())) //will return false. 
     { 
      foo(); 
     } 

現在我看到這個函數IsAssignableFrom正確的工作,因爲它只是告訴你可以直接賦值給變量沒有任何類型的轉換。無論如何修改包裝類來解決這個問題?由於CLR(aka結構體)上的原始類型不允許繼承,我不知道如何管理它。有關於此的任何想法?

在此先感謝。

回答

1

正如SLak指出的那樣,用戶定義的轉換在這種反射方面效果不佳。但從您的樣品中不清楚爲什麼您需要這樣做。如果你只是想測試,如果包裝類型可能潛在包裹展開的類型,你可能只是做:

var wrappedUnderlyingType = wrapped.GetType().GetGenericArguments().Single(); 

if (wrappedUnderlyingType.IsAssignableFrom(unwrapped.GetType())) 
{ 
    foo(); 
} 

如果你能給我們介紹一下爲什麼要進行這種思考的更多的信息,如果測試成功,代碼應該如何進行,我們可能會提供更多幫助。

+0

OR映射程序正在使用IsAssignableFrom檢查它是否可以將數據庫中的類型資金分配給要填充的對象的每個屬性。因爲不想更改數據庫類型/ CLR中的OR映射器中的映射,我認爲我可以解決這個問題。 – Kolja 2010-12-07 16:29:52

1

用戶定義的轉換操作符是具有特殊名稱的普通靜態方法。
與C#編譯器不同,CLR不會爲它們添加任何重要性。

我不認爲你可以做到這一點。
您可以嘗試this trick,但我不確定它是否會起作用。