2010-08-04 76 views
3

我有一個泛型類,如何在不使用泛型的情況下生成泛型變量?

class ComputeScalar<T> : IComputeVariable where T : struct 
{ 
    // This is why i have to use generics. 
    ComputeBuffer<T> buffer; 

    T data; 
} 

class ComputeArray<T> : IComputeVariable where T : struct 
{ 
    // This is why i have to use generics. 
    ComputeBuffer<T> buffer; 

    T[] data; 
} 

,我在另一個類中使用這個類的一個列表,

class SomeClass 
{ 
    List<IComputeVariable> variables; 
} 

我創建的接口,因爲在C#中,我們不能使用類型泛型類參數。 (對吧?)我想了解的是如何使「數據」成爲界面的一員?在運行期間,我如何確定數據類型? (數據可以是任何值類型)

回答

4

你只能讓data通過使弱類型爲object一個接口的成員:

public interface IComputeVariable 
{ 
    object Data { get; } 
} 

(請注意,它必須是一個屬性 - 你可以」 t)指定接口中的字段。)

然後,您可能希望在ComputeScalar<T>中明確實現,以避免在強類型版本可用的情況下使用弱類型版本。

另一種方法是使界面通用,SomeClass

class SomeClass<T> where T : struct 
{ 
    List<IComputeVariable<T>> variables; 
} 

我們真的不足夠了解你的情況就知道這是正確的做法,但這些都是兩個你的選擇。

+0

緩衝區用於發送數據到GPU,並且必須是通用的。所以第二種選擇不是一種選擇,因爲我需要將不同類型的變量發送到GPU。列表必須是通用的。但我會嘗試第一個。 非常感謝。 – Kayhano 2010-08-04 08:23:34

+0

第一個爲我工作,謝謝:) – Kayhano 2010-08-04 08:54:45

1
interface IComputeVariable<T> where T : struct 
{ 
    T Data { get; } 
} 

class ComputeScalar<T> : IComputeVariable<T> where T : struct 
{ 
    // This is why i have to use generics. 
    ComputeBuffer<T> buffer; 

    public T Data {get; set; } 
} 
相關問題