2010-08-13 48 views
1

我目前有一個映射設置來從一個基類轉換到另一個基類。我正在將客戶類映射到第三方控件。值是相似的,但有足夠的差異,我不能重用第三方控件。有沒有辦法使用通用對象參數來設置Func?

_converters = new Dictionary<Type, Func<AnnotationBase, AnnotationMark>>(); 
_converters.Add(typeof(HighlightAnnotation), ToHighlighterAnnotationMark); 
_converters.Add(typeof(RectangleAnnotation), ToRedactionAnnotationMark); 
_converters.Add(typeof(StampAnnotation), ToTextStampAnnotationMark); 

這個作品發現,但我有一些地方要做額外的鑄造。例如:

private AnnotationMark ToTextStampAnnotationMark(AnnotationBase tool) 
{ 
    TextStampAnnotationMark mark = new TextStampAnnotationMark(); 
    mark.Location = new MarkLocation { X = (int)tool.Location.X, Y = (int)tool.Location.Y }; 
    mark.Size = new MarkSize { Width = (int)tool.Size.Width, Height = (int)tool.Size.Height }; 
    mark.Text = ((StampAnnotation)tool).Text; 
    return mark; 
} 

在這個例子中,我必須區分的AnnotationBaseStampAnnotation我知道恰好是正確的,因爲這是與映射程序註冊的類型。不過,我希望將此方法的簽名更改爲private TextStampAnnotationMark ToTestStampAnnotationMark(StampAnnotaion)

是否有反正做功能映射或行爲像這樣?

Func<TTool,TMark>() 
    where TTool : AnnotationBase 
    where TMark : AnnotationMark 

回答

0

這種感覺很愚蠢,我沒有想到它正確的方式。簡單的解決方案是在註冊之前投射對象。

converters.Add(typeof(StampAnnotation), 
    tool => ToTextStampAnnotationMark((StampAnnotation)tool); 
0

這不正是讓你遠離使用任何類型轉換,但它並集中他們,讓他們「安全」:

static class ConvertTest 
{ 
    static IDictionary<Type, IDictionary<Type, Func<AnnotationBase, AnnotationMark>>> _conversions = 
     new Dictionary<Type, IDictionary<Type, Func<AnnotationBase, AnnotationMark>>>(); 

    public static TTo Convert<TFrom, TTo>(this TFrom source) 
     where TFrom : AnnotationBase 
     where TTo : AnnotationMark 
    { 
     var conversion = _conversions[typeof(TFrom)][typeof(TTo)]; 
     return (TTo)conversion(source); 
    } 

    public static void RegisterConversion<TFrom, TTo>(Func<TFrom, TTo> conversion) 
     where TFrom : AnnotationBase 
     where TTo : AnnotationMark 
    { 
     IDictionary<Type, Func<AnnotationBase, AnnotationMark>> toDictionary; 

     if (!_conversions.TryGetValue(typeof(TFrom), out toDictionary)) 
     { 
      toDictionary = new Dictionary<Type, Func<AnnotationBase, AnnotationMark>>(); 
      _conversions.Add(typeof(TFrom), toDictionary); 
     } 

     toDictionary[typeof(TTo)] = (Func<AnnotationBase, AnnotationMark>)conversion; 
    } 
} 

我沒有測試此代碼,順便說一句(它編譯,雖然:))。

相關問題