Непонятное название, которое я знаю. Позвольте мне объяснить.
Мне нужно маршалировать массив структур, которые затем преобразуются в массив классов (совместимость с устаревшими). Например,
public class InnerClass {}
public class OuterClass { private InnerClass[] innerClasses; }
public struct InnerStruct {
// Data
}
private static buildInnerClass( InnerStruct i );
public struct OuterStruct {
private int _numInnerStructs;
private IntPtr _innerStructs;
// Other members
public InnerClass[] InnerClasses {
get {
InnerClass[] ret = new InnerClass[_numInnerStructs];
var structSize = Marshal.SizeOf(typeof(InnerStruct));
var ptr = _innerStructs;
for (int i = 0; i < _numInnerStructs; i++)
{
InnerStruct innerStruct = (InnerStruct)Marshal.PtrToStructure(
ptr, typeof(InnerStruct));
ret[i] = buildInnerClass(innerStruct);
ptr = (IntPtr)((int)ptr + structSize);
}
return ret;
}
}
}
Рассматриваемый в вакууме, в этой практике нет ничего неправильного. Однако вы должны быть осторожны в этом...
В целом, имейте в виду, что свойства должны быть написаны таким образом, что у потребителя не должно быть много, если таковые имеются, причины для кэширования значения по сравнению с вызовом свойства снова. Если ответственный разработчик может следовать этой практике с вашей собственностью, то вы на правильном пути.
Получатель свойства должен быть как можно меньше. В вашем случае, вероятно, лучше использовать обычный метод. Тем более, что возвращение массива из свойства также является плохим.
Не стоит помещать этот код в структуру PInvoke, чем положить его в обычную структуру. Для PInvoke учитываются только поля структуры, поэтому ваш код свойства не будет входить в игру. Это будет иметь значение только тогда, когда ваш код обращается к этому конкретному свойству.