2013-04-25 2 views
0

Я использую 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() 
} 

Есть ли способ сделать это с моим кодом?

+1

Вы не создаете массив - 'MyClass' сам по себе не является массивом. Вы просто рассматриваете его как одно. Но то же самое верно для каждого класса коллекции. Вы также не можете выполнить то, что хотите, и не было бы хорошей идеей (это путало бы читателей вашего кода, что это массив, когда на самом деле это не так) –

+0

Этот код не компилируется. Посмотрите на свой индекс. – leppie

+0

Делай что именно? Ваша библиотека, если у вас нет источника, не может быть изменена. myclass_array_create (UIntPtr) просто возвращает начальный адрес создаваемого массива. То, что вы хотите делать и что вы делаете, точно такое же. –

ответ

1

Нет, вы не можете каким-либо образом переопределить поведение инициализации массива. Вам необходимо либо:

  1. Используйте другой тип, который обертывает массив, как вы показали в вопросе.

  2. Вызвать метод в массиве после его создания, чтобы добавить дополнительную инициализацию (т. Е. Назначить кучу значений каждому индексу).

  3. Создайте новый метод, который при вызове создаст и затем инициализирует массив.

+0

У меня вроде было это предположение, чтобы начать с. Я думаю, что так оно и есть, вероятно, лучшее решение. Я все еще спрашивал, у кого-то может быть решение, которого я просто не мог найти. – gnash117

Смежные вопросы