これはスタックオーバーフローでの最初の質問であり、リフレクションの使用の初心者です。
オブジェクト インスタンスのすべての値を参照用にダンプしたいと考えています (テストで使用された値を追跡するため)。完全なフレームワークではなく、Compact Framework 3.5 を使用しています。あなたの提案のためにそれを覚えておいてください。
次のクラスを想像してください。
public class Camera : IDisposable
{
public Camera.FilenameProperties SnapshotFile;
public double DigitalZoomFactor { get; set; }
public bool DisplayHistogram { get; set; }
public int ImageUpdateInterval { get; set; }
public Camera.ImprintCaptionPosType ImprintCaptionPos { get; set; }
public string ImprintCaptionString { get; set; }
}
「特別な」タイプは次のとおりです。
public class FilenameProperties
{
public string Directory { get; set; }
public string Filename { get; set; }
public Camera.FilenamePaddingType FilenamePadding { get; set; }
public Camera.ImageType ImageFormatType { get; set; }
public Camera.ImageResolutionType ImageResolution { get; set; }
public int JPGQuality { get; set; }
public void Restore();
public void Save();
public enum Fnametype
{
tSnapshot = 0,
tCircularCapture = 1,
}
}
public enum ImprintCaptionPosType
{
Disabled = 0,
LowerRight = 1,
LowerLeft = 2,
LowerCenter = 3,
UpperRight = 4,
UpperLeft = 5,
UpperCenter = 6,
Center = 7,
}
これで、カメラのインスタンスの「ベース」名とプロパティ、およびフィールド名を取得できます。
Camera cam = new Camera();
dumpProperties(cam);
...
void dumpProperties(object oClass)
{
System.Diagnostics.Debug.WriteLine(oClass.ToString());
FieldInfo[] _Info = oClass.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
for(int i = 0; i<_Info.Length; i++)
{
System.Diagnostics.Debug.WriteLine(_Info[i].Name + ":'" + _Info[i].GetValue(oClass).ToString()+"'");
}
foreach (PropertyInfo pi in oClass.GetType().GetProperties())
{
System.Diagnostics.Debug.WriteLine(pi.Name + ":'" + pi.GetValue(oClass, null)
+ "' Type=" + pi.PropertyType.ToString());
}
}
そして、次のようなものを取得します:
Intermec.Multimedia.Camera
SnapshotFile:'Intermec.Multimedia.Camera+FilenameProperties'
DigitalZoomFactor:'1' Type=System.Double
DisplayHistogram:'False' Type=System.Boolean
ImageUpdateInterval:'1' Type=System.Int32
ImprintCaptionPos:'Disabled' Type=Intermec.Multimedia.Camera+ImprintCaptionPosType
ImprintCaptionString:'' Type=System.String
ここで、DigitalZoomFactor や ImageUpdateInterval などの単純なプロパティについては必要なものを取得しますが、ネストされたクラス (正しい言い方ですか?) については、たとえば SnapshotFile のような型のみを取得します。ネストされた列挙型の場合、「ImprintCaptionPos」と同様に値を取得します。
SnapshotFile フィールド/プロパティの FilenameProperties.Filename のようなネストされた値の値を取得するにはどうすればよいですか?
dumpProperties(cam.SnapshotFile) を使用すると、探している出力が得られます。
Intermec.Multimedia.Camera+FilenameProperties
Directory:'\Program Files\FrmCamera' Type=System.String
Filename:'myphoto' Type=System.String
ImageFormatType:'JPG' Type=Intermec.Multimedia.Camera+ImageType
FilenamePadding:'None' Type=Intermec.Multimedia.Camera+FilenamePaddingType
ImageResolution:'Medium' Type=Intermec.Multimedia.Camera+ImageResolutionType
JPGQuality:'100' Type=System.Int32
しかし、どうすればそれを自動化できますか?
多くの検索とテスト コーディングを行いましたが、解決策を見つけることができませんでした。問題は、フィールドのインスタンスを取得して反復できるようにしているようです。
Camera クラスのソース コードがないため、そこにコードを追加または削除することはできません。
誰でも助けることができますか?
デバッガーが示すようなものを取得する必要があります。