{"id":1918,"date":"2024-06-16T20:56:09","date_gmt":"2024-06-16T20:56:09","guid":{"rendered":"https:\/\/www.w3computing.com\/articles\/?p=1918"},"modified":"2024-06-16T21:01:36","modified_gmt":"2024-06-16T21:01:36","slug":"unlocking-power-reflection-csharp-dynamic-code-manipulation","status":"publish","type":"post","link":"https:\/\/www.w3computing.com\/articles\/unlocking-power-reflection-csharp-dynamic-code-manipulation\/","title":{"rendered":"Unlocking the Power of Reflection in C# for Dynamic Code Manipulation"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Reflection in C# is a powerful feature that allows developers to inspect and interact with object types and members at runtime. This capability opens up a wide array of possibilities, from dynamically creating instances and invoking methods to accessing and modifying fields and properties. In this tutorial, we will explore the depth of reflection in C# and how it can be used for dynamic code manipulation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Introduction to Reflection<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Reflection is the ability of a program to inspect and modify its own structure and behavior at runtime. In C#, the <code>System.Reflection<\/code> namespace provides classes and methods that facilitate reflection. This capability is especially useful in scenarios where code needs to be highly flexible and adaptable, such as in frameworks, libraries, and tools that operate on other code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Reflection can be used to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Discover information about assemblies, modules, and types.<\/li>\n\n\n\n<li>Create and manipulate instances of types dynamically.<\/li>\n\n\n\n<li>Invoke methods, access fields, and properties dynamically.<\/li>\n\n\n\n<li>Perform late binding, where methods and properties are accessed at runtime instead of compile time.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2. Key Components of Reflection<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Assemblies<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">An assembly in .NET is a compiled code library used for deployment, versioning, and security. It can contain one or more managed types (classes, interfaces, enums, etc.).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Types<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A type in .NET represents the definition of a particular kind of object, including classes, structs, interfaces, enums, and delegates. The <code>Type<\/code> class in the <code>System<\/code> namespace is central to reflection.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Members<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Members are the constituents of a type, including fields, properties, methods, constructors, events, and nested types. Reflection allows interaction with these members at runtime.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Basic Usage of Reflection<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Loading Assemblies<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Before you can inspect types or members, you need to load the assembly that contains them. Assemblies can be loaded using several methods, such as <code>Assembly.Load<\/code>, <code>Assembly.LoadFrom<\/code>, or <code>Assembly.GetExecutingAssembly<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">using<\/span> System;\n<span class=\"hljs-keyword\">using<\/span> System.Reflection;\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-comment\">\/\/ Load an assembly by its name<\/span>\n        Assembly assembly = Assembly.Load(<span class=\"hljs-string\">\"mscorlib\"<\/span>);\n\n        <span class=\"hljs-comment\">\/\/ Load an assembly from a file path<\/span>\n        Assembly assemblyFromFile = Assembly.LoadFrom(<span class=\"hljs-string\">\"path\/to\/your\/assembly.dll\"<\/span>);\n\n        <span class=\"hljs-comment\">\/\/ Get the currently executing assembly<\/span>\n        Assembly currentAssembly = Assembly.GetExecutingAssembly();\n\n        Console.WriteLine(<span class=\"hljs-string\">\"Assembly Loaded: \"<\/span> + currentAssembly.FullName);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Getting Types<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Once an assembly is loaded, you can get types defined in it using the <code>GetTypes<\/code> method or get a specific type using the <code>GetType<\/code> method.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">Type&#91;] types = assembly.GetTypes();\n<span class=\"hljs-keyword\">foreach<\/span> (Type type <span class=\"hljs-keyword\">in<\/span> types)\n{\n    Console.WriteLine(<span class=\"hljs-string\">\"Type: \"<\/span> + type.FullName);\n}\n\n<span class=\"hljs-comment\">\/\/ Get a specific type<\/span>\nType specificType = assembly.GetType(<span class=\"hljs-string\">\"System.String\"<\/span>);\nConsole.WriteLine(<span class=\"hljs-string\">\"Specific Type: \"<\/span> + specificType.FullName);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Working with Members<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">After obtaining a type, you can inspect its members (fields, properties, methods, etc.) using methods like <code>GetFields<\/code>, <code>GetProperties<\/code>, <code>GetMethods<\/code>, and <code>GetConstructors<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">MethodInfo&#91;] methods = specificType.GetMethods();\n<span class=\"hljs-keyword\">foreach<\/span> (MethodInfo method <span class=\"hljs-keyword\">in<\/span> methods)\n{\n    Console.WriteLine(<span class=\"hljs-string\">\"Method: \"<\/span> + method.Name);\n}\n\nPropertyInfo&#91;] properties = specificType.GetProperties();\n<span class=\"hljs-keyword\">foreach<\/span> (PropertyInfo property <span class=\"hljs-keyword\">in<\/span> properties)\n{\n    Console.WriteLine(<span class=\"hljs-string\">\"Property: \"<\/span> + property.Name);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">4. Advanced Reflection Techniques<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Dynamic Method Invocation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Reflection allows you to invoke methods on objects dynamically. This can be particularly useful when the method to be called is not known at compile time.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">using<\/span> System;\n<span class=\"hljs-keyword\">using<\/span> System.Reflection;\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-comment\">\/\/ Get the type of the class<\/span>\n        Type type = <span class=\"hljs-keyword\">typeof<\/span>(MyClass);\n\n        <span class=\"hljs-comment\">\/\/ Create an instance of the class<\/span>\n        <span class=\"hljs-keyword\">object<\/span> instance = Activator.CreateInstance(type);\n\n        <span class=\"hljs-comment\">\/\/ Get the method information<\/span>\n        MethodInfo methodInfo = type.GetMethod(<span class=\"hljs-string\">\"MyMethod\"<\/span>);\n\n        <span class=\"hljs-comment\">\/\/ Invoke the method<\/span>\n        methodInfo.Invoke(instance, <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-keyword\">object<\/span>&#91;] { <span class=\"hljs-string\">\"Hello, Reflection!\"<\/span> });\n    }\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyClass<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">MyMethod<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> message<\/span>)<\/span>\n    {\n        Console.WriteLine(message);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Creating Instances Dynamically<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Using reflection, you can create instances of types at runtime, which is useful in scenarios where types are not known until runtime.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-comment\">\/\/ Get the type<\/span>\nType type = <span class=\"hljs-keyword\">typeof<\/span>(MyClass);\n\n<span class=\"hljs-comment\">\/\/ Create an instance using the default constructor<\/span>\n<span class=\"hljs-keyword\">object<\/span> instance = Activator.CreateInstance(type);\n\n<span class=\"hljs-comment\">\/\/ Create an instance using a specific constructor<\/span>\nConstructorInfo ctor = type.GetConstructor(<span class=\"hljs-keyword\">new<\/span> Type&#91;] { <span class=\"hljs-keyword\">typeof<\/span>(<span class=\"hljs-keyword\">string<\/span>) });\n<span class=\"hljs-keyword\">object<\/span> instanceWithParam = ctor.Invoke(<span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-keyword\">object<\/span>&#91;] { <span class=\"hljs-string\">\"Parameter\"<\/span> });<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Accessing and Modifying Fields and Properties<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Reflection allows you to get and set the values of fields and properties dynamically.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-comment\">\/\/ Create an instance of the class<\/span>\n        MyClass instance = <span class=\"hljs-keyword\">new<\/span> MyClass();\n\n        <span class=\"hljs-comment\">\/\/ Get the type<\/span>\n        Type type = <span class=\"hljs-keyword\">typeof<\/span>(MyClass);\n\n        <span class=\"hljs-comment\">\/\/ Get the field information<\/span>\n        FieldInfo fieldInfo = type.GetField(<span class=\"hljs-string\">\"myField\"<\/span>, BindingFlags.NonPublic | BindingFlags.Instance);\n\n        <span class=\"hljs-comment\">\/\/ Get and set the field value<\/span>\n        fieldInfo.SetValue(instance, <span class=\"hljs-number\">42<\/span>);\n        Console.WriteLine(<span class=\"hljs-string\">\"Field Value: \"<\/span> + fieldInfo.GetValue(instance));\n\n        <span class=\"hljs-comment\">\/\/ Get the property information<\/span>\n        PropertyInfo propertyInfo = type.GetProperty(<span class=\"hljs-string\">\"MyProperty\"<\/span>);\n\n        <span class=\"hljs-comment\">\/\/ Get and set the property value<\/span>\n        propertyInfo.SetValue(instance, <span class=\"hljs-string\">\"Hello, Property!\"<\/span>);\n        Console.WriteLine(<span class=\"hljs-string\">\"Property Value: \"<\/span> + propertyInfo.GetValue(instance));\n    }\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyClass<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> myField;\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> MyProperty { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">5. Practical Applications of Reflection<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Plugin Architecture<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Reflection is often used in plugin architectures where the application can load and interact with external plugins dynamically.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">using<\/span> System;\n<span class=\"hljs-keyword\">using<\/span> System.Reflection;\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-comment\">\/\/ Load the plugin assembly<\/span>\n        Assembly pluginAssembly = Assembly.LoadFrom(<span class=\"hljs-string\">\"path\/to\/plugin.dll\"<\/span>);\n\n        <span class=\"hljs-comment\">\/\/ Get the plugin type<\/span>\n        Type pluginType = pluginAssembly.GetType(<span class=\"hljs-string\">\"PluginNamespace.PluginClass\"<\/span>);\n\n        <span class=\"hljs-comment\">\/\/ Create an instance of the plugin<\/span>\n        <span class=\"hljs-keyword\">object<\/span> pluginInstance = Activator.CreateInstance(pluginType);\n\n        <span class=\"hljs-comment\">\/\/ Invoke a method on the plugin<\/span>\n        MethodInfo pluginMethod = pluginType.GetMethod(<span class=\"hljs-string\">\"Execute\"<\/span>);\n        pluginMethod.Invoke(pluginInstance, <span class=\"hljs-literal\">null<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Serialization and Deserialization<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Reflection can be used to implement custom serialization and deserialization mechanisms, especially for complex objects that are not easily handled by standard serializers.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">using<\/span> System;\n<span class=\"hljs-keyword\">using<\/span> System.Reflection;\n<span class=\"hljs-keyword\">using<\/span> System.Text.Json;\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        MyClass instance = <span class=\"hljs-keyword\">new<\/span> MyClass { Id = <span class=\"hljs-number\">1<\/span>, Name = <span class=\"hljs-string\">\"John Doe\"<\/span> };\n\n        <span class=\"hljs-comment\">\/\/ Serialize the object to JSON<\/span>\n        <span class=\"hljs-keyword\">string<\/span> json = SerializeToJson(instance);\n        Console.WriteLine(<span class=\"hljs-string\">\"Serialized JSON: \"<\/span> + json);\n\n        <span class=\"hljs-comment\">\/\/ Deserialize the JSON back to an object<\/span>\n        MyClass deserializedInstance = DeserializeFromJson&lt;MyClass&gt;(json);\n        Console.WriteLine(<span class=\"hljs-string\">\"Deserialized Object: \"<\/span> + deserializedInstance.Name);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">string<\/span> <span class=\"hljs-title\">SerializeToJson<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">object<\/span> obj<\/span>)<\/span>\n    {\n        Type type = obj.GetType();\n        PropertyInfo&#91;] properties = type.GetProperties();\n\n        <span class=\"hljs-keyword\">var<\/span> jsonDict = <span class=\"hljs-keyword\">new<\/span> Dictionary&lt;<span class=\"hljs-keyword\">string<\/span>, <span class=\"hljs-keyword\">object<\/span>&gt;();\n\n        <span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-keyword\">var<\/span> property <span class=\"hljs-keyword\">in<\/span> properties)\n        {\n            jsonDict&#91;property.Name] = property.GetValue(obj);\n        }\n\n        <span class=\"hljs-keyword\">return<\/span> JsonSerializer.Serialize(jsonDict);\n    }\n\n    <span class=\"hljs-keyword\">static<\/span> T DeserializeFromJson&lt;T&gt;(<span class=\"hljs-keyword\">string<\/span> json)\n    {\n        Type type = <span class=\"hljs-keyword\">typeof<\/span>(T);\n        PropertyInfo&#91;] properties = type.GetProperties();\n\n        <span class=\"hljs-keyword\">var<\/span> jsonDict = JsonSerializer.Deserialize&lt;Dictionary&lt;<span class=\"hljs-keyword\">string<\/span>, <span class=\"hljs-keyword\">object<\/span>&gt;&gt;(json);\n        T obj = (T)Activator.CreateInstance(type);\n\n        <span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-keyword\">var<\/span> property <span class=\"hljs-keyword\">in<\/span> properties)\n        {\n            <span class=\"hljs-keyword\">if<\/span> (jsonDict.ContainsKey(property.Name))\n            {\n                property.SetValue(obj, Convert.ChangeType(jsonDict&#91;property.Name], property.PropertyType));\n            }\n        }\n\n        <span class=\"hljs-keyword\">return<\/span> obj;\n    }\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyClass<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> Id { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span> Name { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Unit Testing and Mocking<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Reflection can be utilized in unit testing frameworks to discover and execute tests dynamically or to mock objects and methods for testing purposes.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">using<\/span> System;\n<span class=\"hljs-keyword\">using<\/span> System.Reflection;\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-comment\">\/\/ Discover and run tests in the assembly<\/span>\n        Assembly testAssembly = Assembly.LoadFrom(<span class=\"hljs-string\">\"path\/to\/testassembly.dll\"<\/span>);\n        Type&#91;] testTypes = testAssembly.GetTypes();\n\n        <span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-keyword\">var<\/span> type <span class=\"hljs-keyword\">in<\/span> testTypes)\n        {\n            MethodInfo&#91;] methods = type.GetMethods();\n\n            <span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-keyword\">var<\/span> method <span class=\"hljs-keyword\">in<\/span> methods)\n            {\n                <span class=\"hljs-keyword\">if<\/span> (method.GetCustomAttribute&lt;TestMethodAttribute&gt;() != <span class=\"hljs-literal\">null<\/span>)\n                {\n                    <span class=\"hljs-keyword\">object<\/span> instance\n\n = Activator.CreateInstance(type);\n                    method.Invoke(instance, <span class=\"hljs-literal\">null<\/span>);\n                    Console.WriteLine(<span class=\"hljs-string\">$\"Test <span class=\"hljs-subst\">{method.Name}<\/span> executed successfully.\"<\/span>);\n                }\n            }\n        }\n    }\n}\n\n&#91;<span class=\"hljs-meta\">AttributeUsage(AttributeTargets.Method)<\/span>]\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TestMethodAttribute<\/span> : <span class=\"hljs-title\">Attribute<\/span> { }\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyTests<\/span>\n{\n    &#91;<span class=\"hljs-meta\">TestMethod<\/span>]\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">TestMethod1<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">\"TestMethod1 executed.\"<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">6. Best Practices and Performance Considerations<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">While reflection is a powerful tool, it should be used judiciously due to potential performance overhead and security implications. Here are some best practices:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Minimize Reflection Usage<\/strong>: Use reflection sparingly, as it can be slower than direct code execution.<\/li>\n\n\n\n<li><strong>Cache Reflection Results<\/strong>: Cache the results of reflection operations (e.g., types, methods, properties) to avoid repeated costly lookups.<\/li>\n\n\n\n<li><strong>Security Considerations<\/strong>: Be mindful of security risks, especially when dealing with untrusted code or data.<\/li>\n\n\n\n<li><strong>Use Reflection-Only Loading<\/strong>: When you only need to inspect an assembly without executing its code, use <code>Assembly.ReflectionOnlyLoad<\/code>.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Reflection in C# is a versatile and powerful feature that can greatly enhance the flexibility and capability of your applications. From dynamic method invocation to creating plugin architectures, the possibilities are vast. By understanding and utilizing reflection effectively, you can unlock new dimensions of dynamic code manipulation and adaptability in your software projects.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Whether you&#8217;re building frameworks, implementing custom serialization, or designing extensible applications, mastering reflection can be a valuable addition to your development toolkit. Remember to balance the power of reflection with considerations for performance and security to ensure your applications remain efficient and robust.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Reflection in C# is a powerful feature that allows developers to inspect and interact with object types and members at runtime. This capability opens up a wide array of possibilities, from dynamically creating instances and invoking methods to accessing and modifying fields and properties. In this tutorial, we will explore the depth of reflection in [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[8,4],"tags":[],"class_list":["post-1918","post","type-post","status-publish","format-standard","category-csharp","category-programming-languages","entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Unlocking the Power of Reflection in C# for Dynamic Code Manipulation<\/title>\n<meta name=\"description\" content=\"Reflection is the ability of a program to inspect and modify its own structure and behavior at runtime. In C#, the System.Reflection namespace\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.w3computing.com\/articles\/unlocking-power-reflection-csharp-dynamic-code-manipulation\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Unlocking the Power of Reflection in C# for Dynamic Code Manipulation\" \/>\n<meta property=\"og:description\" content=\"Reflection is the ability of a program to inspect and modify its own structure and behavior at runtime. In C#, the System.Reflection namespace\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.w3computing.com\/articles\/unlocking-power-reflection-csharp-dynamic-code-manipulation\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-16T20:56:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-16T21:01:36+00:00\" \/>\n<meta name=\"author\" content=\"w3compadmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"w3compadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/unlocking-power-reflection-csharp-dynamic-code-manipulation\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/unlocking-power-reflection-csharp-dynamic-code-manipulation\\\/\"},\"author\":{\"name\":\"w3compadmin\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"headline\":\"Unlocking the Power of Reflection in C# for Dynamic Code Manipulation\",\"datePublished\":\"2024-06-16T20:56:09+00:00\",\"dateModified\":\"2024-06-16T21:01:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/unlocking-power-reflection-csharp-dynamic-code-manipulation\\\/\"},\"wordCount\":688,\"articleSection\":[\"C#\",\"Programming Languages\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/unlocking-power-reflection-csharp-dynamic-code-manipulation\\\/\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/unlocking-power-reflection-csharp-dynamic-code-manipulation\\\/\",\"name\":\"Unlocking the Power of Reflection in C# for Dynamic Code Manipulation\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\"},\"datePublished\":\"2024-06-16T20:56:09+00:00\",\"dateModified\":\"2024-06-16T21:01:36+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"description\":\"Reflection is the ability of a program to inspect and modify its own structure and behavior at runtime. In C#, the System.Reflection namespace\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/unlocking-power-reflection-csharp-dynamic-code-manipulation\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/unlocking-power-reflection-csharp-dynamic-code-manipulation\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/unlocking-power-reflection-csharp-dynamic-code-manipulation\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Articles Home\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Programming Languages\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/programming-languages\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Unlocking the Power of Reflection in C# for Dynamic Code Manipulation\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\",\"name\":\"Developer Articles Hub\",\"description\":\"\",\"alternateName\":\"Developer Articles\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\",\"name\":\"w3compadmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"contentUrl\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"caption\":\"w3compadmin\"},\"sameAs\":[\"http:\\\/\\\/w3computing.com\\\/articles\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Unlocking the Power of Reflection in C# for Dynamic Code Manipulation","description":"Reflection is the ability of a program to inspect and modify its own structure and behavior at runtime. In C#, the System.Reflection namespace","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.w3computing.com\/articles\/unlocking-power-reflection-csharp-dynamic-code-manipulation\/","og_locale":"en_US","og_type":"article","og_title":"Unlocking the Power of Reflection in C# for Dynamic Code Manipulation","og_description":"Reflection is the ability of a program to inspect and modify its own structure and behavior at runtime. In C#, the System.Reflection namespace","og_url":"https:\/\/www.w3computing.com\/articles\/unlocking-power-reflection-csharp-dynamic-code-manipulation\/","article_published_time":"2024-06-16T20:56:09+00:00","article_modified_time":"2024-06-16T21:01:36+00:00","author":"w3compadmin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"w3compadmin","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.w3computing.com\/articles\/unlocking-power-reflection-csharp-dynamic-code-manipulation\/#article","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/unlocking-power-reflection-csharp-dynamic-code-manipulation\/"},"author":{"name":"w3compadmin","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"headline":"Unlocking the Power of Reflection in C# for Dynamic Code Manipulation","datePublished":"2024-06-16T20:56:09+00:00","dateModified":"2024-06-16T21:01:36+00:00","mainEntityOfPage":{"@id":"https:\/\/www.w3computing.com\/articles\/unlocking-power-reflection-csharp-dynamic-code-manipulation\/"},"wordCount":688,"articleSection":["C#","Programming Languages"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.w3computing.com\/articles\/unlocking-power-reflection-csharp-dynamic-code-manipulation\/","url":"https:\/\/www.w3computing.com\/articles\/unlocking-power-reflection-csharp-dynamic-code-manipulation\/","name":"Unlocking the Power of Reflection in C# for Dynamic Code Manipulation","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/#website"},"datePublished":"2024-06-16T20:56:09+00:00","dateModified":"2024-06-16T21:01:36+00:00","author":{"@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"description":"Reflection is the ability of a program to inspect and modify its own structure and behavior at runtime. In C#, the System.Reflection namespace","breadcrumb":{"@id":"https:\/\/www.w3computing.com\/articles\/unlocking-power-reflection-csharp-dynamic-code-manipulation\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.w3computing.com\/articles\/unlocking-power-reflection-csharp-dynamic-code-manipulation\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.w3computing.com\/articles\/unlocking-power-reflection-csharp-dynamic-code-manipulation\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Articles Home","item":"https:\/\/www.w3computing.com\/articles\/"},{"@type":"ListItem","position":2,"name":"Programming Languages","item":"https:\/\/www.w3computing.com\/articles\/programming-languages\/"},{"@type":"ListItem","position":3,"name":"Unlocking the Power of Reflection in C# for Dynamic Code Manipulation"}]},{"@type":"WebSite","@id":"https:\/\/www.w3computing.com\/articles\/#website","url":"https:\/\/www.w3computing.com\/articles\/","name":"Developer Articles Hub","description":"","alternateName":"Developer Articles","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.w3computing.com\/articles\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561","name":"w3compadmin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","url":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","contentUrl":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","caption":"w3compadmin"},"sameAs":["http:\/\/w3computing.com\/articles"]}]}},"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"w3compadmin","author_link":"https:\/\/www.w3computing.com\/articles\/author\/w3compadmin\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1918","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/comments?post=1918"}],"version-history":[{"count":3,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1918\/revisions"}],"predecessor-version":[{"id":1922,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1918\/revisions\/1922"}],"wp:attachment":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/media?parent=1918"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/categories?post=1918"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/tags?post=1918"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}