我有一些我無法控制的代碼。此代碼接受一個對象參數,並嘗試將其轉換爲在編譯時已知這樣一種類型的:通過投影算子進行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
,而MyClass
是DataRowView
的包裝類,它必須從其他類型派生。 MyClass
保留對DataRowView
的引用。我沒有將ComboBox.DataSource
綁定到DataView
,而是將它綁定到IList<MyClass>
,但我仍然需要ComboBox
能夠訪問DataRowView
列值,就好像我綁定的是IList<DataRowView>
。不幸的是,轉換操作符以我所害怕的方式工作:它只考慮編譯時類型信息來進行轉換(但是,它在相同繼承樹中的類型之間進行轉換時使用運行時類型信息)。
爲什麼不用一個函數創建'MyType',並返回一個基於'MyType'實例屬性構建的'KnownType'實例?您可以將'myType.ToKnownType()'傳遞給期望'KnownType'的函數。 – xxbbcc
@xxbbcc他說他無法控制班級進行轉換。 – Servy
它也取決於代碼是如何檢查傳入的對象。它可能會明確檢查對象是否是確切類型,甚至不是從它繼承的對象。 – DavidG