67417
以前、[C#
dynamicに格納されたクラス内の構造体の値を取得する](https://ja.stackoverflow.com/questions/66864/c-dynamic%e3%81%ab%e6%a0%bc%e7%b4%8d%e3%81%95%e3%82%8c%e3%81%9f%e3%82%af%e3%83%a9%e3%82%b9%e5%86%85%e3%81%ae%e6%a7%8b%e9%80%a0%e4%bd%93%e3%81%ae%e5%80%a4%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b)にて回答をいただいた方法で構造体の値を取得しているのですが、下記のように構造体内に配列があると、うまく値が取れてきません。

```

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct MyStruct
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
            public int[] val;
        }
    
```

おそらく、`{ get; set; }`をつけていないことにより`var props =
val.GetType().GetProperties();`のところで値が取得できていないのが原因だと思われます。  
上記に`{ get; set; }`をつけると、`属性 'MarshalAs' は、この宣言型では無効です。'field, param, return'
の宣言でのみ有効です。`とのエラーが起こります。  
上記どのようにすれば値をとってこれるかご教授いただきたいです。  
ご回答お待ちしております。

* * *

迅速なご回答ありがとうございます。  
確かにフィールドとプロパティの違いに対する理解が不足しておりました。  
今回は、構造体をDLLに渡す必要があるため、後者の方法で、配列を持つ構造体と持たない構造体で、`GetFields`か`GetProperties`を使い分ける対応を取りました。  
ご教授の方、ありがとうございました。
CC BY-SA 4.0
2020-06-08T06:59:20.147
67416
2020-06-08T09:17:11.670
2020-06-08T09:17:11.670
40279
40279
question
c#
C# 構造体内の配列の値の取り出し方
フィールド変数とプロパティの違いを十分理解出来ていないようです。  
`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`を使用することで構造体内のフィールド変数の値にアクセス出来ます。
CC BY-SA 4.0
2020-06-08T07:45:02.100
67417
2020-06-08T07:45:02.100
6157
67416
answer