2011-01-26 59 views
2

有沒有什麼辦法,使這樣的工作代碼:鑄造類型參數爲基本型無拳

public class Func2<A, B> 
{ 
    private Func<A, B> f; 

    public Func2(Func<A, B> f) 
    { 
     this.f = f; 
    } 

    public object invoke(object obj, long l) 
    { 
     if (typeof(B) == typeof(long)) 
     { 
      if (obj != null) 
       l = (long)obj; 
      return f((B)l); //error! cannot convert type 'long' to 'B' 
     } else { 
      return f((B)obj); 
     } 
    } 
} 

這裏的問題是,我不能直接投B到長時間沒有鑄造B首先反對。我試圖避免不惜一切代價,因爲這會減慢很多功能的快速操作。那麼有什麼辦法可以做到這一點?

我知道我實際上可以定義一個專門的Func2來專門處理B長的情況。但隨着函數的長度增長,長和對象的組合將呈指數級增長 - 而且在實際使用情況下,我還希望支持雙打!有沒有什麼辦法可以在沒有拳擊的情況下支持這個?也許有不安全的代碼?

謝謝! Cauê

+4

什麼是你想在這裏做?如果你讓我們知道可能會有更好的方法 – 2011-01-26 17:34:12

+0

我正在爲C#編寫一個haXe(haxe.org)目標,並且我試圖找到用C#代表HaXe函數類型的最佳方法。 HaXe函數類型與CLR不同,允許將Func 轉換爲Func (例如)。所以我試圖找到一種能夠在我們可以的時候調用無盒子參數的方法,並且當我們不知道類型時調用盒裝版本。 – Waneck 2011-01-26 17:43:24

回答

3

可以重載的方法,並且代替long值強制轉換爲A,你可以投的委託Func<long, B>

public class Func2<A, B> { 

    private Func<A, B> f; 

    public Func2(Func<A, B> f) { 
    this.f = f; 
    } 

    public B invoke(long a) { 
    if (typeof(A) == typeof(long)) { 
     return (f as Func<long, B>)(a); 
    } else { 
     throw new NotSupportedException(); 
    } 
    } 

    public B invoke(object a) { 
    return f((A)a); 
    } 

} 

例子:

Func2<long, string> f = new Func2<long, string>(l => l.ToString()); 

Console.WriteLine(f.invoke(42)); // calls the invoke(long) method 
Console.WriteLine(f.invoke("x")); // calls the invoke(object) method 
0

剛剛發現答案! :)

public object invoke(object obj, long l) 
{ 
    if (typeof(B) == typeof(long)) 
    { 
     if (obj != null) 
      l = (long)obj; 
     Func<A, long> x = (Func<A, long>)(object)f; 
     return x(l); 
    } else { 
     return f((B)obj); 
    } 
} 

這種方式我們不必自動複製長對象,但我們實際上投了Func類型來接收我們指定的長!至於爲什麼我要這樣做,請閱讀上面的評論,並且我仍然試圖找到一個最好的方法來做到這一點。

到現在爲止,我們有以下haXe的代碼:

var f:Int->Int->Float = function(x:Int, y:Int) return x + y + 0.5; 
var f2:Dynamic->Dynamic->Dynamic = f; // ok 
var f3:Dynamic->Int->Dynamic = f; //also ok 
f2(10, 30); // ok - this will box the 10 and 30 

我想要做的就是創建一個具有invoke調用,將採取兩種盒裝和拆箱參數的FUN3類型。如果底層函數真的接受無箱類型,它將首先嚐試使用它們。

謝謝!