66870


**やりたいこと**  
Dynamicに格納されたクラスのプロパティにある構造体の値を取得したい。

**ソース**  
Dynamicに格納されるクラス

[code]

    class hoge
        {
            private int _foo;
            public int Foo 
            {
               get { return _foo; }
               set { this._foo = value; }
            }
    
            private MyStruct _structName = new MyStruct();
            public MyStruct StructName 
            {
               get { return _structName; }
               set { this._structName = value; }
            }
    
            //この中身を取ってきたい
            [StructLayout(LayoutKind.Sequential, Pack = 1)]
            public struct MyStruct
            {
                int a;
                byte b;
                string c;
            }
        }
    
[/code]

値取得部分

[code]

    ----省略----
    
    dynamic huga = new hoge();
    
    // ここでプロパティは取得できている
    var properties = hoge.GetType.GetProperties();
    
    foreach(PropertyInfo p in properties){
    
        ----p が プリミティブか判定処理----
    
        // ここで構造体の中身自体は取れてきている
        var val = p.GetValue(hoge, null);
    
        // 構造体の中身を順次出力したい
        foreach(var v in val)
        {
            Console.WriteLine(v);
            /// 期待結果
            /// a の値
            /// b の値
            /// c の値
        }   
    }
    
[/code]

**現状について**  
デバッグを行うと、p.GetValue(hoge, null)で構造体内の要素自体は取得できているのですが、それを出力する方法がわかりません。

**試したことや推測について**  
上記コードだとforeachで「IEnumerableに暗黙的に変換できません」とエラーが起きますが、これはvalの中身はMyStructのインスタンスしか入っていないためだと考えています。

ほかにも、GetPropertiesなど試しましたが、hugaの型は「dynamic{hoge}」となっていることから、Dynamicクラスのプロパティを取得してしまいます。

わかりづらくて申し訳ございませんがご回答の方お待ちしております。


CC BY-SA 4.0
2020-05-22T03:07:12.263
66864
2020-05-22T05:03:45.633
40279
question
c#
C# dynamicに格納されたクラス内の構造体の値を取得する


`[StructLayout(LayoutKind.Sequential, Pack = 1)]`が適用出来ているのか不明ですが、  
以下のような変更で値の出力は出来るようになります。

`public struct MyStruct`の中身を以下に変更します。  
(すべてに`public`と`{ get; set; }`を付ける)

[code]

    public struct MyStruct
    {
        public int a { get; set; }
        public byte b { get; set; }
        public string c { get; set; }
    }
    
[/code]

処理の方は以下のように変更します。

[code]

    dynamic huga = new hoge();
    
    // ここでプロパティは取得できている ?
    // 変更 hoge ではなく huga に, GetTypeには () を追記
    var properties = huga.GetType().GetProperties();
    
    foreach (PropertyInfo p in properties)
    {
        // ここで構造体の中身自体は取れてきている
        var val = p.GetValue(huga, null);
    
        // ----p が プリミティブか判定処理---- は順番を変更して上記の後で行う
        if (val.GetType().IsPrimitive)
        {
            Console.WriteLine(val);
        }
        else
        {   // 外側のクラスと同じ処理を行う
            var props = val.GetType().GetProperties();
            foreach (var prop in props)
            {
                object value = prop.GetValue(val, null);
                Console.WriteLine(value);
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2020-05-22T05:03:45.633
66870
2020-05-22T05:03:45.633
26370
66864
answer