Search code examples
c#reflectioncompact-frameworkdumpgetproperties

DumpObject with GetFields and GetProperties for instance with nested class


this is my first question in stackoverflow and I am a beginner in using reflection.

I would like to dump all values of an object instance for reference (to keep track about used values on a test). I am using Compact Framework 3.5 not the full framework. Keep that in mind for your suggestions.

Imagine following classes:

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; }
}

where the 'special' types are:

    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,
    }

Now, I can get the 'base' names and properties and the field names of an instance of camera:

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());
        }
    }

and then get soemthing like this:

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

Now, for simple properties like DigitalZoomFactor and ImageUpdateInterval I get what I need, but for the nested class (correct wording?) I only get the type as for example with SnapshotFile. For the nested enum I get the value as with 'ImprintCaptionPos'.

How can I get the values of the nested values like FilenameProperties.Filename of the SnapshotFile field/property?

If I use dumpProperties(cam.SnapshotFile), I get the output I am looking for:

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

But how can I automate that?

I did a lot of search and test coding but was unable to find a solution. The problem seems to be getting the instance of the field to be able to iterate thru it.

I do not have the source code of the Camera class, so I cannot add or remove code in there.

Can anyone help?

I need to get something like the debugger shows: enter image description here


Solution

  • OK, I find a way (a workaround) to get all properties (in an XML but who cares) using the code from here:

    The output is xml like but acceptable for me. Here an excerpt:

    <xml version="1.0" encoding="utf-8">
    <Camera xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    ...
        <ImprintCaptionPos>Disabled</ImprintCaptionPos>
            <SnapshotFile>
            <Directory>\\Program Files\\FrmCamera</Directory>
            <Filename>myphoto</Filename>
            <ImageFormatType>JPG</ImageFormatType>
            <FilenamePadding>None</FilenamePadding>
            <ImageResolution>Medium</ImageResolution>
            <JPGQuality>100</JPGQuality>
        </SnapshotFile>
    ...
    

    In my code I just have to call

            string s = serialization.mySerialize.SerializeObject<Intermec.Multimedia.Camera>(cam);
    

    To get a 'dump' of all current properties of the instance.

    Thanks to all for your help. Possibly I was misunderstood with my question and reflection is unable to give what I want.

    Thanks

    Josef