我想將一堆類型轉換爲一堆其他類型。例如,我有四個類型,SourceA
,SourceB
,TargetA
和TargetB
,我有以下的轉換:使用泛型M:N轉換
- SourceA => TargetA
- SourceA => TargetB
- SourceB => TargetA
- SourceB => TargetB
基本上,轉換比簡單演員稍高一點。對於上述每種情況,它都需要一個非常自己的策略。
我想做些什麼避免是具有包含類型的方法名幾種方法,所以我做不想要的東西,如:
ConvertAtoA
或類似的東西。我不想這樣做的原因是因爲這些類型然後被用作字符串,而不是類型本身,所以每當我去重命名一個類型時,都沒有重構支持。假設我將SourceA
重命名爲SourceXyz
,該方法不會自動更名,但我必須手動執行此操作。
我想要的是一種表達此的通用方式,主要是爲了獲得重構支持。所以基本上的東西,如:
Convert<SourceA, TargetA>(mySourceValue)
這裏的問題是,我結束了它包含一個通用Convert<TSource, TTarget>
方法ALL的邏輯ALL類型(這是顯而易見的原因是一個壞主意) 。
我已經看過各種設計模式,包括訪客,策略和責任鏈,但沒有一個引人注目。無論如何,我不確定我是否錯過了一個點。
我該如何解決這個問題?
基本上,兩個主要的目標是:
- 具有單獨的轉換邏輯的每個組合(沒有複雜的方法)
- 具有重構支持(無類型字符串)
任何想法?
更新1:我已經考慮過使用AutoMapper,但我不確定它是否按我想要的方式工作。我可以肯定做的是建立一個自定義的轉換器,如
Mapper.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter());
,但後來我又具有與轉換器名稱的一部分的類型DateTime
。我知道我也可以在這裏使用lambda表達式,但是這又使得代碼變得醜陋,因爲它會變得很長。總之,我擔心我不能擁有一切......
更新2:總是有一個Dictionary<string, string>
(雖然內容不同)在左邊,一個你可以通過戴上約束緩解的問題自定義類在右邊。因此,我想直到結束是
dictionary.To<TargetA>()
,但沒有必要把所有的邏輯轉換爲不同的類型分爲To<T>
方法的擴展方法等。
你試過AutoMapper嗎? – daryal
查看問題的更新;-) –
您可以使用FactoryPattern獲取適當的Converter。 – TGlatzer