2013-07-10 53 views
1

我有一個DynamicObject與實施的TryConvert方法。下面的代碼工作得很好:當通過對象投射TryConvert時不會被調用

dynamic d = GetMyDynamic(); 
int i = (int)d; // TryConvert is called and returns the proper int value 

然而,當d被轉換爲對象,轉換在運行時失敗:

object o = d; 
int i = (int)o; // TryConvert is not called. InvalidCastException thrown 

當然,(int)(dynamic)o沒有工作,符合市場預期。

這是爲什麼?有什麼辦法可以解決這個問題嗎(int)o會叫TryConvert

回答

2

原因其實很簡單:如果您不使用dynamic關鍵字,則不使用動態語言運行時(DLR)。但動態語言運行時稱爲TryConvert方法。

沒有DLR,o只是MyDynamicObject類型的對象,您試圖將其轉換爲int。這失敗了,因爲MyDynamicObject不是int

+0

無賴。這意味着我的用戶需要投入動態(我正在動態創建動態代理,而我的用戶並沒有真正意識到他們)。 – zmbq

+0

@zmbq:這根本不是動態問題。正如Vyacheslav Volkov在他的回答中所表明的那樣,如果您返回一個「普通」類型,該類型具有帶'object'作爲返回類型的方法的顯式轉換運算符,則會出現同樣的問題。根據您試圖達到的目標,有幾種不同的解決方案。也許你可以描述最終目標。 –

+0

我創建了一個動態視圖模型,通過保留當前值的快照並定期掃描更改來自動觸發INotifyPropertyChanged事件。動態視圖模型爲每個屬性返回動態代理包裝器。用戶只會遇到IValueConverters中的代理 - 這是WPF將綁定對象傳遞迴用戶代碼的地方。我寧願不強迫我的用戶投入動態。雖然很容易不創建原始類型的代理(無論如何都沒有意義),但它不能解決100%的問題。 – zmbq

2

我完全同意Daniel Hilgarth。爲了更好地理解這是爲什麼如此考慮超負荷運營商的例子:

public class TestClass 
{ 
    public static explicit operator int(TestClass d) 
    { 
     return 1; 
    } 
} 

var testClass = new TestClass(); 
object obj = testClass; 
var value = (int)testClass;//No exceptions here, because the CLR knows how to cast TestClass to int. 
var i = (int)obj;//Exception here, because the CLR doesn't know how to cast object to int. 
相關問題