如何在不使用泛型的情况下制作通用变量?

时间:2010-08-04 08:16:57

标签: c# generics

我有一个通用类,

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#中我们不能将泛型类用于类型参数。 (对吧?)我想学习的是如何让“数据”成为界面的一员?在运行期间,我如何确定数据类型? (数据可以是任何ValueType)

2 个答案:

答案 0 :(得分:4)

您只能通过将data弱化键入object作为接口的成员:

public interface IComputeVariable
{
    object Data { get; }
}

(请注意,它必须是属性 - 您不能在接口中指定字段。)

您可能希望在ComputeScalar<T>中明确实现该功能,以避免在强类型版本可用的情况下使用弱类型版本。

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

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

我们对您的情况了解不足以了解哪种方法正确,但这些是您的两种选择。

答案 1 :(得分: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; }
}