我正在使用pinvokes来调用本机代码。覆盖C类的数组的默认新运营商#
,如果我要创建我目前做的原生对象的数组以下
public class MyClass() {
// allocate a single myClass;
public MyClass() {
_myClass = myclass_create();
_length = 1;
}
public MyClass(int numArgs) {
//pInvoke call to create an array of myclass;
_myClass = myclass_array_create(UIntPtr);
_length = numArgs;
}
//access the indexed element of myclass
public MyClass this[int index] {
get {
MyClass ret = new MyClass();
ret._myClass = myclass_array_element(this._myClass, (UIntPtr)index);
return ret;
}
}
public int Length {
get {
return _length;
}
}
public void foo(){
//lots of other code
}
[DllImport(DLL_IMPORT_TARGET)]
private static extern IntPtr myclass_create();
[DllImport(DLL_IMPORT_TARGET)]
private static extern IntPtr myclass_array_create(UIntPtr numArgs);
[DllImport(DLL_IMPORT_TARGET)]
private static extern IntPtr myclass_array_element(IntPtr args, UIntPtr index);
// ... more dllimports here ...
//pointer to native object
IntPtr _myClass;
int _length;
}
现在这是使用方法如下:然而
// Create an array of 15 MyClass objects
MyClass myClass = new MyClass(15);
for(int i = 0; i < myClass.Length; ++i) {
//run foo on each object in the array
myClass[i].foo()
}
我有这方面的工作刚刚发现这是有点不同寻常的是,我们需要为新阵列添加新阵列来调用新阵列。
是否有一种方法可以重写此类的新运算符,以便可以使用新运算符的典型用法?
我想代码看起来像这样
// Create an array of 15 MyClass objects
MyClass[] myClass = new MyClass[15];
for(int i = 0; i < myClass.Length; ++i) {
//run foo on each object in the array
myClass[i].foo()
}
有没有办法用我的代码来做到这一点?
你没有创建一个数组 - “MyClass”本身并不是一个数组。你只是简单地对待它。但是对于每个集合类都是如此。你也不能完成你想要的东西,也不会是一个好主意(它会混淆你的代码的读者,它实际上不是一个数组) – 2013-04-25 15:51:47
这段代码不能编译。看看你的索引器。 – leppie 2013-04-25 15:52:17
做什么?你的图书馆,除非你有源无法修改。 myclass_array_create(UIntPtr)只是返回所创建数组的起始地址。你想要做什么和你在做什么是完全一样的。 – 2013-04-25 15:56:19