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