我知道一个令人困惑的标题。让我解释一下。
我必须编组一个结构数组,然后将其转换为类数组(传统兼容性)。例如
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;
}
}
}
答案 0 :(得分:5)
在真空中观察,这种做法没有任何本质上的错误。但是,你应该小心......
一般来说,请记住,属性应该以这样的方式编写,即消费者不应该有很多(如果有的话)缓存值而不是再次调用属性的理由。如果负责任的开发人员可以对您的财产采取这种做法,那么您就是在正确的轨道上。
答案 1 :(得分:4)
财产的吸气力应尽可能小。在您的情况下,使用常规方法可能更好。特别是因为从属性返回数组也是一个坏主意。
答案 2 :(得分:1)
将该代码放在PInvoke结构中并不比将它放在普通结构中更糟糕。出于PInvoke的目的,只考虑结构的字段,因此您的属性代码将不起作用。只有当您的代码访问该特定属性时,它才会相关。