>>7

フィールドの名前なしでいいなら>>8の通り.tupleofを使う、名前ありなら下のコードで可能
class CTest{
 int mNum;
 string mText;
 void Function(){}
}
void main(){
 foreach(mem;__traits(allMembers, CTest)){
  static if (is(typeof(mixin("&CTest." ~ mem))))
   pragma(msg, "f ", mem);
  else
   pragma(msg, "@ ", mem, ", isType = ", mixin("is(CTest." ~ mem ~ ")"));
 }
}
interface Object.Monitorが出てきたのでisType==falseではじく必要がある。

あと、__traitsで取ってきたタプルをforeachで回すと、ループ内のコードはコンパイル時に評価される。
ので、>>7のコードは考えとしては正しい。