Я использую 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()
}
Я эту работу просто найти, однако это немного необычно, чтобы назвать новое для чего-то, что представляет собой массив без выполнения массива new.
Есть ли способ, которым я могу переопределить новый оператор для этого класса, чтобы вместо этого можно было использовать типичное использование нового оператора?
Я хотел бы код, чтобы посмотреть, как этот
// 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' сам по себе не является массивом. Вы просто рассматриваете его как одно. Но то же самое верно для каждого класса коллекции. Вы также не можете выполнить то, что хотите, и не было бы хорошей идеей (это путало бы читателей вашего кода, что это массив, когда на самом деле это не так) –
Этот код не компилируется. Посмотрите на свой индекс. – leppie
Делай что именно? Ваша библиотека, если у вас нет источника, не может быть изменена. myclass_array_create (UIntPtr) просто возвращает начальный адрес создаваемого массива. То, что вы хотите делать и что вы делаете, точно такое же. –