2011-09-23 55 views
1

我希望能夠使用Key作爲對象類型將函數存儲在字典中。所有的函數都會接受來自同一個基類的對象。我希望能夠(基於註冊函數)將類轉換爲DbCommand。我在下面列出了我的代碼,看起來是正確的,但語法錯誤,等等。我想我錯過了一些非常簡單的東西......任何幫助將不勝感激!帶有類型作爲鍵的字典中派生類型參數的函數

private Dictionary<object, Func<TrackingRecord, DbCommand>> conversionFunctions = new Dictionary<object, Func<TrackingRecord, DbCommand>>(); 


public void RegisterConversionFunction<T>(Func<T, DbCommand> conversionFunction) where T : TrackingRecord 
    { 
     conversionFunctions.Add(typeof(T), conversionFunction); 
    } 

public DbCommand GetConverstion<T>(T trackingRecord) where T : TrackingRecord 
    { 
     DbCommand command = null; 

     if (conversionFunctions.ContainsKey(trackingRecord.GetType())) 
     { 
      Func<T, DbCommand> conversionFunction; 
      if (conversionFunctions.TryGetValue(trackingRecord.GetType(), out conversionFunction)) 
      { 
       command = conversionFunction.Invoke(trackingRecord); 
      } 
     } 
     else 
     { 
      command = DefaultConversion(trackingRecord); 
     } 
     return command; 
    } 
+0

哪個版本的C#/ .net是這個? –

+0

VS2010 .NET 4.0 – slocumro

+0

TrackingRecord是一個自定義類 – slocumro

回答

2

與你原來的解決方案的問題是,該方法的簽名Func<T, DbCommand>不匹配預期值Func<TrackingRecord, DbCommand>。爲了解決這個問題,因爲你知道,T被約束到從TrackingRecord繼承,你可以創建一個預期的簽名(Func<TrackingRecord, DbCommand>)相匹配的包裝功能部件和鑄鐵的參數T.

試試這個:

private Dictionary<object, Func<TrackingRecord, DbCommand>> conversionFunctions = new Dictionary<object, Func<TrackingRecord, DbCommand>>(); 

public void RegisterConversionFunction<T>(Func<T, DbCommand> conversionFunction) where T : TrackingRecord 
{ 
    conversionFunctions.Add(typeof(T), tr => conversionFunction((T)tr)); 
} 

public DbCommand GetConverstion<T>(T trackingRecord) where T : TrackingRecord 
{ 
    DbCommand command = null; 
    Func<TrackingRecord, DbCommand> conversionFunction; 

    if (conversionFunctions.TryGetValue(typeof(T), out conversionFunction)) 
     command = conversionFunction.Invoke(trackingRecord); 
    else 
     command = DefaultConversion(trackingRecord); 

    return command; 
} 
+0

完美!並感謝您清楚解釋! – slocumro

+1

我把它清理了一下,所以它只檢查字典一次,並且使用T(這樣T的子類無法解析,因爲它們應該),並且也使用強大的強制轉換而不是「as」強制轉換,這樣錯誤更加明顯。 –

相關問題