質問: val.GetType().GetProperties();`のところで値が取得できていないのが原因だと思われます。 上記に`{ get; set; }`をつけると、`属性 'MarshalAs' は、この宣言型では無効です。'field, param, return' の宣言でのみ有効です。`とのエラーが起こります。 上記どのようにすれば値をとってこれるかご教授いただきたいです。 ご回答お待ちしております。 --- 迅速なご回答ありがとうございます。 確かにフィールドとプロパティの違いに対する理解が不足しておりました。 今回は、構造体をDLLに渡す必要があるため、後者の方法で、配列を持つ構造体と持たない構造体で、`GetFields`か`GetProperties`を使い分ける対応を取りました。 ご教授の方、ありがとうございました。
回答: フィールド変数とプロパティの違いを十分理解出来ていないようです。 `public int[] val;` のように宣言すればこれはフィールド、`public int[] val { get; set; }`のように`{get;set;}` を付けるとプロパティとして宣言されます。 表向きな動作は似ている点もありますが内部構造としては全く別のものとなります。 問題解決のアプローチとしては2つあります。 1つめはフィールドにアクセスするためのプロパティを用意する方法。 ``` [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public int[] val; public int[] valProperty { get { return val; } } ``` のようにフィールドへアクセスするためのプロパティを用意することで`valProperty`を通じて`val`を間接的に参照出来ます。 2つ目はリフレクション時に`GetFields`を使用する方法。 ``` var fields = fuga.GetType().GetFields(); foreach (FieldInfo p in fields) { var val = p.GetValue(fuga); foreach (var v in val) { Console.WriteLine(v); } } ``` のように`GetPropaties`ではなく`GetFields`を使用することで構造体内のフィールド変数の値にアクセス出来ます。