Reflection in C# provides the ability to examine type information at runtime. Let's create a sample class to demonstrate reflection capabilities:
public class SampleType
{
private int _privateField;
private int PrivateProp { get; set; }
protected int ProtectedProp { get; set; }
public int PublicProp { get; set; }
public void PublicMethod() {}
private static void PrivateStaticMethod() {}
public static string PublicStaticMethod(string s) => s;
}
Retrieving Type Members
To examine all members of a type, including non-public ones:
Type type = typeof(SampleType);
var members = type.GetMembers(
BindingFlags.NonPublic |
BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.Static);
foreach (var member in members)
{
Console.WriteLine($"{member.Name} - {member.MemberType}");
}
Working with Fields
Accessing and modifying fields dynamically:
var instance = new SampleType();
var fields = type.GetFields(
BindingFlags.NonPublic |
BindingFlags.Public |
BindingFlags.Instance);
foreach (var field in fields)
{
// Get field value
var value = field.GetValue(instance);
Console.WriteLine($"{field.Name}: {value}");
// Set field value
field.SetValue(instance, 100);
}
Inspecting Properties
Examining and manipulating properties through reflection:
var properties = type.GetProperties(
BindingFlags.NonPublic |
BindingFlags.Public |
BindingFlags.Instance);
foreach (var prop in properties)
{
var getter = prop.GetGetMethod(true);
var setter = prop.GetSetMethod(true);
// Invoke property methods
setter?.Invoke(instance, new object[] { 42 });
var currentValue = getter?.Invoke(instance, null);
Console.WriteLine($"{prop.Name}: {currentValue}");
}
Analyzing Methods
Examining method details and invoking them:
var methods = type.GetMethods(
BindingFlags.NonPublic |
BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.Static);
foreach (var method in methods)
{
var parameters = method.GetParameters();
if (parameters.Length > 0 && parameters[0].ParameterType == typeof(string))
{
var result = method.Invoke(instance, new object[] { "test" });
Console.WriteLine($"{method.Name} returned: {result}");
}
}