我有一个普通班

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)

最佳答案

您只能通过弱地将其输入data来使object成为接口的成员:

public interface IComputeVariable
{
    object Data { get; }
}


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

然后,您可能希望在ComputeScalar<T>中显式实现该功能,以避免在有强类型版本的地方使用弱类型版本。

另一种选择是使接口通用,SomeClass也是如此:

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


我们对您的处境确实了解不足,无法确定哪种方法正确,但这是您的两个选择。

10-04 14:18