2016-09-15 73 views
7

我有一些我無法控制的代碼。此代碼接受一個對象參數,並嘗試將其轉換爲在編譯時已知這樣一種類型的:通過投影算子進行C#動態轉換

KnownType item = (KnownType) parameter; 

是否有可能在C#設計能夠作爲傳遞自定義類MyClass(而不是從KnownType衍生)參數到上面的代碼,並通過上述代碼轉換爲KnownType,條件是MyClass可以使用其成員方法本身轉換成KnownType

protected KnownType ConvertToKnownType() 
{ 
    // conversion code goes here 
} 

我試圖實現自定義轉換運算符是這樣的:

public static implicit operator KnownType(MyClass source) 
{ 
    KnownType result; 
    // conversion goes here 
    return result; 
} 

但它沒有工作(它沒有使用)。我是否有權假定,只有在編譯時已知源類型,目標類型和轉換運算符時,該轉換運算符才能工作?

編輯: 我最初沒有提供關於代碼轉換的更多細節,因爲我認爲它是無關緊要的,因爲我主要關注轉換操作符的實現方式,即它是否需要查看運行時鍵入以找到合適的轉換器或者是在編譯時做出的決定?

要清除事情,KnownType實際上是DataRowView,而MyClassDataRowView的包裝類,它必須從其他類型派生。 MyClass保留對DataRowView的引用。我沒有將ComboBox.DataSource綁定到DataView,而是將它綁定到IList<MyClass>,但我仍然需要ComboBox能夠訪問DataRowView列值,就好像我綁定的是IList<DataRowView>。不幸的是,轉換操作符以我所害怕的方式工作:它只考慮編譯時類型信息來進行轉換(但是,它在相同繼承樹中的類型之間進行轉換時使用運行時類型信息)。

+1

爲什麼不用一個函數創建'MyType',並返回一個基於'MyType'實例屬性構建的'KnownType'實例?您可以將'myType.ToKnownType()'傳遞給期望'KnownType'的函數。 – xxbbcc

+0

@xxbbcc他說他無法控制班級進行轉換。 – Servy

+0

它也取決於代碼是如何檢查傳入的對象。它可能會明確檢查對象是否是確切類型,甚至不是從它繼承的對象。 – DavidG

回答

6

不,這是不可能的。如果您能夠從該課程中派生您的班級,則提供的演員將只有成功。不基於繼承的任何類型的轉換都需要執行轉換的類執行與其所做的不同的事情。

我是否有權假定,只有在編譯時知道源類型,目標類型和轉換運算符時,鑄型運算符才起作用?

是的。

+0

請注意,如果'KnownType'是*接口*(或從MarshalByRefObject派生的類型),則可以通過提供透明代理作爲'parameter'來誘騙運行時調用自定義轉換函數(您可以使用'RealProxy'實現)。 –