(home | about | stats)

pwyky: Introspection

.NET has some nice classes that are similar to the Java reflection implementation. You can do something like this:

class TestRequest
    {
        public string foo = "bar";
        public string bar = null;
        private string fubar = null;
    }

    class Program
    {
        static void Main(string[] args)
        {
            TestRequest t = new TestRequest();

            Type reqType = t.GetType();
            MemberInfo[] members = reqType.GetMembers();

            foreach(MemberInfo member in members)
            {
                if (member.MemberType == MemberTypes.Field)
                {
                    string name = member.Name;
                    FieldInfo info = reqType.GetField(name);
                    object o = info.GetValue(t);
                    if (o != null)
                        Console.WriteLine(name + " " + o);
                }
            }            
        }
    }

to print all the non-null public fields in a class. Now, why would you want to do that? Well, one thing you can do is create a hashtable of key/value pairs:

            Type reqType = t.GetType();
            MemberInfo[] members = reqType.GetMembers();
            Dictionary<string, string> parameters = new Dictionary<string, string>;

            foreach(MemberInfo member in members)
            {
                if (member.MemberType == MemberTypes.Field)
                {
                    string name = member.Name;
                    FieldInfo info = reqType.GetField(name);
                    object o = info.GetValue(t);
                    if (o != null)
                        parameters.Add(name, o.ToString());
                }
            }

You can also do something crazy, like serialize objects to a HTTP get request, even if you don't know what type the object is:

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Reflection;
using System.Text;

namespace introRequest
{
    class TestRequest
    {
        public string foo = "bar";
        public string bar = null;
        private string fubar = null;
    }

    class Program
    {
        static void Main(string[] args)
        {
            TestRequest t = new TestRequest();

            Type reqType = t.GetType();
            MemberInfo[] members = reqType.GetMembers();			

            StringBuilder url = new StringBuilder("http://www.example.com/req");

            bool bFirst = true;

            foreach (MemberInfo member in members)
            {
                if (member.MemberType == MemberTypes.Field)
                {
                    string name = member.Name;
                    FieldInfo info = reqType.GetField(name);
                    object o = info.GetValue(t);
                    if (o != null)
                    {
                        if (bFirst)
                        {
                            url.AppendFormat("?{0}={1}", name, o.ToString());
                            bFirst = false;
                        }
                        else
                            url.AppendFormat("&{0}={1}", name, o.ToString());
                    }
                }
            }

            WebRequest req = WebRequest.Create(url);
            Console.WriteLine(new StreamReader(
                req.GetResponse().GetResponseStream()).ReadToEnd());
        }
    }
}
www.mobilitytech.com owner. This is a pwyky site.