◆ フィールドは普通にクラス内で宣言した変数
◆ プロパティは getter/setter を通してるクラス内変数

dynamic 使うならもちろん reflection も使うわけですが フィールドとプロパティの違いで悩まされました

JavaScript では全部がプロパティです
なので GetProperties というメソッドを見つけて これがプロパティ取得するものなんだと思ってとりあえず匿名クラスに使ってみました
new { num = 1, str = "abc" };

では ちゃんと 2 つのプロパティが取得できました

ですが
public class sample{
public int num;
public string str;
}

こういうクラスを用意して
new sample { num = 1, str = "abc" };

これに GetProperties を使うとプロパティなしになります

BindingFlags.Public や BindingFlags.NonPublic などオプションを色々変えてみてもダメでやっぱり中身がどうなってるよくわからない言語は無理 と諦めかけていたときに Field というものが存在するというのを見かけました

IntelliSense で確認すると GetFields というメソッドもあります
こっちだと sample のインスタンスでもプロパティを取得できました


フィールドというのがある前提で調べてみると フィールドがプロパティだと私が思ってたもので 普通にクラス内で定義されたインスタンス所属の変数です

プロパティ は getter setter でアクセスできるものです
どちらも外側からは同じ用に扱えます
getter だけ定義で読み取り専用 などの高度なことはメソッドを通すプロパティでしかできないようです

さっきの sample も
public class sample{
public int num { get; set; }
public string str { get; set; }
}
こう書き換えると properties で取得できました

オブジェクト渡すと Dictionary 変換する関数を使っていたのでとりあえず同じ方法で取れるように全部プロパティ化することにしました

フィールドもプロパティもまとめて取れるやつないのかな