2010-08-04 73 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; } 
} 
相关问题