2013-04-25 50 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() 
} 

我有这方面的工作刚刚发现这是有点不同寻常的是,我们需要为新阵列添加新阵列来调用新阵列。

是否有一种方法可以重写此类的新运算符,以便可以使用新运算符的典型用法?

我想代码看起来像这样

// 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”本身并不是一个数组。你只是简单地对待它。但是对于每个集合类都是如此。你也不能完成你想要的东西,也不会是一个好主意(它会混淆你的代码的读者,它实际上不是一个数组) – 2013-04-25 15:51:47

+0

这段代码不能编译。看看你的索引器。 – leppie 2013-04-25 15:52:17

+0

做什么?你的图书馆,除非你有源无法修改。 myclass_array_create(UIntPtr)只是返回所创建数组的起始地址。你想要做什么和你在做什么是完全一样的。 – 2013-04-25 15:56:19

回答

1

不,您不能以任何方式覆盖数组初始化的行为。您需要:

  1. 使用不同类型的包装了一个数组,你在问题中显示。

  2. 创建它后添加额外的初始化(即为每个索引分配一堆值)后调用数组上的方法。

  3. 创建一个新方法,该方法在被调用时将创建并初始化该数组。

+0

我曾经有过这样的假设。我认为它的做法可能是最好的解决方案。我仍然问,有人可能有我找不到的解决方案。 – gnash117 2013-04-25 16:55:43