Exploring Reflection in C# for Runtime Type Inspection

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

Tags: C# reflection RuntimeTypeInspection metadata

Posted on Sat, 04 Jul 2026 16:40:20 +0000 by Dongowarrior