2010-10-15 15 views
1

我想這樣做以下,但由於牛逼本質上只是一個System.Object的這是不行的。我知道T可以被一個接口約束,但這不是一個選項。有沒有一種技術來區分泛型類的類行爲?

public class Vborr<T> where T : struct 
    { 

    public Vborr() 
    { 
    public T Next() 
    { 
     if (typeof(T) == typeof(Double)) 
     { 
     // do something for doubles 
     } 
     if (typeof(T) == typeof(Float)) 
     { 
     // do something different for floats.. 
     } 
    } 
    } 

我經常發現缺少C#泛型。

謝謝!

Paul

+0

爲什麼不工作?你想做什麼?我並不是說這是一個好主意,但是這個代碼應該像現在這樣編譯好(一旦你修正了錯別字)。 – LukeH 2010-10-15 15:35:31

+0

你的問題在哪裏?你的ifs按類型區分行爲,所以你已經找到了解決方案。如果你轉換爲Float ...失敗,你可以嘗試(float)(object)x。但我不確定這個盒子是不是。 – CodesInChaos 2010-10-15 15:36:45

+1

從你提供的2個案例中,聽起來像你正在尋找'where T:INumeric'或其他東西?我希望我們可以有這樣的功能,但我認爲這不會很快發生.. – Ani 2010-10-15 15:37:33

回答

7

泛型的關鍵在於您可以對任何有效類型執行相同操作。

如果你真正做具體的類型的東西,那麼該方法不通用了,應該被重載爲每個特定類型。

public class Vborr<T> where T : struct 
{ 
    public virtual T Next() { // Generic Implementation } 
} 

public class VborrInt : Vborr<int> 
{ 
    public override int Next() { // Specific to int } 
} 

public class VborrDouble : Vborr<double> 
{ 
    public override double Next() { // Specific to double } 
} 
+0

+1這就是我正在寫的東西。 – 2010-10-15 15:32:48

+0

在某些情況下,可以將它作爲性能優化來避免接口或lambda調用。例如MiscUtil中的Operator類可以從中獲益。 – CodesInChaos 2010-10-15 15:36:00

+0

是的,好點。但是因爲對於我的用戶調用public T Next(),對於Doubles或Floats來說,行爲在功能上是相同的。他們不應該不得不面對W /兩班(你不能超載在C#返回類型......只有在IL是可能的) – Paul 2010-10-15 15:43:04

1

我會採取這裏的做法是將一個工廠模式和創建基於斷類型的Vborr專門的實例。例如

public class Vborr<T> where T : struct { 
    protected Vborr() { } 
    abstract T Next(); 
} 

public static class VborrFactory { 
    private sealed class VborrFloat : Vborr<float> { 
    public VborrFloat() {} 
    public override float Next() { 
     ... 
    } 
    } 
    private sealed class VborrDouble : Vborr<double> { 
    public VborrDobule() {} 
    public override double Next() { 
     ... 
    } 
    } 
    private sealed class VborrDefault<U> : Vborr<U> { 
    public VborrDefault() {} 
    public override U Next() { 
     ... 
    } 
    } 
    public static Vborr<T> Create<T>() { 
    if (typeof(T) == typeof(double)) { 
     return new VborrDouble(); 
    } else if (typeof(T) == typeof(float)) { 
     return new VborrFloat(); 
    } else { 
     return new VborrDefault<T>(); 
    } 
    } 
} 
+0

啊,是的,謝謝。這是一個好主意。 – Paul 2010-10-15 15:54:29

相關問題