2014-10-22 82 views
0

我正在使用以下方法。如果已知爲Int64,如何將Int64類型的值提供給Generic類型?

public static Generic Get<Generic>(this object self) 
{ 
    try { return (Generic)self; } 
    catch (Exception) { return default(Generic); } 
} 

一個新的要求說,如果一個的Int64它需要被映射到-13。我試圖通過返回所述固定值來處理它,如果類型是Int64像這樣。

public static Generic Get<Generic>(this object self) 
{ 
    if (self == null && typeof (Generic) == typeof (long)) 
    return -13; 

    try { return (Generic)self; } 
    catch (Exception) { return default(Generic); } 
} 

但是,編譯感到不舒服,因爲它擔心,我會回來-13通用類型是不符合稱值。我如何解決它?

我試着用谷歌搜索自定義默認值,但得到了納達。

回答

3

你可以把它框以object第一:

return (Generic)(object)-13; 

然後你就會有兩次轉換是在編譯時可以接受的一個鏈條。

+0

難道就沒有別的辦法嗎?演員陣容看起來非常醜陋......我可以忍受它,但我想知道這是一種變通還是**的方式。 – 2014-10-22 08:17:59

+1

@KonradViltersten我個人還沒有找到另一種不能解決的辦法。如果你想避免只在句法上進行雙重鑄造,那麼你可以在頂部創建一個'object'局部變量,將數字賦給它並在稍後返回該變量的值(先將其轉換爲'Generic')。但我不確定有什麼方法可以避免雙重轉換。 – 2014-10-22 08:20:57

2

嘗試這樣做:

public static Generic Get<Generic>(this object self) 
{ 
    return 
     self == null && typeof(long) == typeof(Generic) 
     ? (Generic)(object)-13L 
     : (Generic)self; 
} 

鑑於多種類型的擴展要求,那麼這個工程:

private static Dictionary<Type, Delegate> map = new Dictionary<Type, Delegate>() 
{ 
    { typeof(long), (Func<object, long>)(o => o == null ? -13 : (long)o) }, 
    { typeof(float), (Func<object, float>)(o => o == null ? -13.0f : (float)o) }, 
    { typeof(double), (Func<object, double>)(o => o == null ? -13.0 : (double)o) }, 
}; 

public static Generic Get<Generic>(this object self) 
{ 
    return 
     map.ContainsKey(typeof(Generic)) 
      ? ((Func<object, Generic>)(map[typeof(Generic)]))(self) 
      : (Generic)self; 
} 
+0

我撒了一點點。要求實際上是* long *和* float *。可能甚至* double *。我將不得不構建三個(或更多!)返回語句,或者我可以概括內部thingy不具有後綴* L *嗎? – 2014-10-22 08:17:02

+0

您需要檢查三種類型的條件。 – 2014-10-22 08:17:48

+0

@oussamaabdou Theodoros建議的方法如何? – 2014-10-22 08:18:36

相關問題