我有一个类,其中有一个字段被赋值为类型T的数组或者类型T的dll对象,该对象具有重载this [int i]
以模拟数组(它使用非托管内存,并使用重载访问该内存)
public T this[int i]
{
get
{
return ((T[])array)[i]; // can't use return array[i] directly
}
set { }
}
当我使用dll对象时,它会抛出转换异常。 我原以为
(T [])
将触发对象的重载[]
而不是强制转换为float []
,但它总是强制转换为 float []
,并且对象类型是 FloatArr
,其中具有 public float this [int i]
。
是否有一种方式可以将基元数组视为同时将其他自定义类型视为重载触发器的转换?
如果这不可能,如何返回类型 T
,而返回类型(如简单的浮点数数组或某些自定义类型,具有重载来返回浮点数)可以从中获取 float
? 我不想一个个添加float,int,byte,double,char等。 无论对象字段是C#数组还是自定义类型与重载索引器,我都需要类型 T
适用于所有情况?
实际上我需要什么:
// developer supplies here with his/hers own array
// or this library uses its own fast C++ wrapper with a [] overload
public object array { get; set; }
// returns float, int, byte
public T this[int i]
{
get
{
return array[i]; // float[], int[], FloatArr[], ...
}
set { }
}
编辑:如果这是一个不好的设计模式,请告诉我。我需要这个类将属性视为C#数组或带有[]
重载的C++包装器C# dll对象。
编辑-2:这是我想要的用法:
MyArr<float> gpu = new MyArr<float>(1024);
gpu.array=new float[1024];
gpu[35]=40;
or
MyArr<float> gpu = new MyArr<float>(1024);
gpu.allocateUnManagedToArray(); // now array field is a custom object
gpu[35]=40;
编辑-3: 这里是我放入数组字段的自定义类:
public class FloatArr
{
public float this[int i]
{
get
{
unsafe
{
float* p = (float*)hArr.ToPointer();
return *(p + i);
}
}
set {
unsafe
{
float* p = (float*)hArr.ToPointer();
*(p + i) = value;
}
}
}
}
编辑-4: 以防我没有表达清楚:
- 我有一个类,其中
[]
重载为数组 - 但它也有一个字段,有时会给另一个重载
[]
的类! - 现在我只需要其他开发人员能够提供自己的C#数组,当他们不想要这个类自己的C++包装对象时。
- 然后,在两种情况下,我都需要从同一字段(浮点数组或具有
[]
重载的C++包装器)进行索引。
当然,我可以逐一编写所有float int byte的条件,但这样会花费更长的时间。通用类很容易,应该很容易,但我在这里缺少了一些东西,我看不见。当我添加结构体数组时,代码将在未来增长得更多,因此我无助地需要通用类的帮助。
public T[] array { get; set; }
?我不明白。 - Erik Philipsit
是什么?T
还是T[]
?由于T
是泛型,我不知道为什么T
不能是任何类型(托管或非托管)。 - Erik PhilipsT[]
不能转换成一个数组呢?这正是你要告诉它做的事情。也许你实际上想转换为IList<T>
,然后使用提供的索引器?这里一份 [mcve](最小可复现代码示例)会非常有帮助... - Jon SkeetallocateUnManagedToArray()
的代码以及它所分配给array
内部的类的完整定义。 - Scott Chamberlain