2017-04-05 41 views
0

我使用將C#中的類的結構作爲序列化庫的一部分進行比較的代碼。使用反射創建開放泛型類型時忽略約束條件

我偶然發現了一個問題與特定的通用類設置:

class B<Y> where Y: B<Y> {} 
class A<X>: B<A<X>> {} 

我已經有Type型代表開放泛型類型B<>開放泛型類型A<>的對象。現在我想創建開放通用類型B<A<>>,我將用作其他關閉通用類型的模板。爲了做到這一點我嘗試使用MakeGenericType方法:

typeof(B<>).MakeGenericType(typeof(A<>)) 

,但它結束了關於「無效通用參數」的異常。這是合理的,因爲類型A<>不符合Y通用參數的約束。

我知道我可以通過調用typeof(A<>).BaseType來獲得我想要的類型,但它不適合我的算法流程,似乎不是一個通用的解決方案。我的問題是:有沒有辦法創建一個開放類型B<A<>>忽略/推遲約束檢查到創建時關閉它的版本?

+0

不是我所知道的 - 我懷疑這樣一種能力的使用將會是如此微不足道,以至於它不值得在API中使用。 –

+1

我複製了你的代碼來運行它,它對我來說工作正常。產生'B \'1 [A \'1 [X]]'。 https://dotnetfiddle.net/qR9uAs – thehennyy

+0

@thehennyy謝謝!你是對的。它工作正常,但...不是在單聲道。我沒有在我的問題中提及它,並沒有在發佈之前在.NET上測試代碼。 – houen

回答

0

感謝@thehennyy的評論,我證實這是Linux Mono 4.8.0中的一個錯誤。我報告了here並等待反應。