Reflection is a feature in C# that allows a program to inspect and manipulate its own structure and behavior at runtime, such as accessing types, methods, and properties dynamically.
Click to reveal answer
intermediate
How does reflection bypass compile-time safety?
Reflection bypasses compile-time safety by allowing code to access and invoke members dynamically without the compiler checking types or access modifiers, which can lead to runtime errors if used incorrectly.
Click to reveal answer
intermediate
Give an example of a compile-time safety check that reflection can bypass.
An example is accessing a private field or method. Normally, the compiler prevents this, but reflection can access private members at runtime, ignoring access modifiers.
Click to reveal answer
intermediate
What risks come with using reflection to bypass compile-time safety?
Using reflection to bypass compile-time safety can cause runtime errors, security risks, and harder-to-maintain code because type checks and access rules are ignored until runtime.
Click to reveal answer
beginner
Why might a developer choose to use reflection despite bypassing compile-time safety?
Developers use reflection for flexibility, such as dynamically loading types, accessing private members for testing, or building frameworks that work with unknown types at runtime.
Click to reveal answer
What does reflection allow you to do in C#?
APrevent runtime errors automatically
BInspect and modify program structure at runtime
CCompile code faster
DEnforce strict type checking at compile time
✗ Incorrect
Reflection lets you inspect and modify program structure during runtime, not at compile time.
Which safety feature does reflection bypass?
ACompile-time safety checks
BRuntime type checking
CGarbage collection
DMemory allocation
✗ Incorrect
Reflection bypasses compile-time safety checks by allowing dynamic access to members.
What can happen if reflection is used incorrectly?
ACompile-time errors
BAutomatic code optimization
CFaster program execution
DRuntime errors and security risks
✗ Incorrect
Incorrect use of reflection can cause runtime errors and security issues.
Which member can reflection access that normal code cannot?
APrivate fields and methods
BOnly static members
CPublic methods only
DOnly inherited members
✗ Incorrect
Reflection can access private fields and methods, bypassing access modifiers.
Why is reflection useful despite its risks?
AIt prevents all runtime errors
BIt enforces strict typing
CIt allows dynamic and flexible code
DIt replaces the compiler
✗ Incorrect
Reflection allows dynamic code that can work with types unknown at compile time.
Explain how reflection can bypass compile-time safety in C# and what that means for program behavior.
Think about what compile-time safety normally protects and how reflection ignores those protections.
You got /4 concepts.
Describe a scenario where using reflection to bypass compile-time safety might be helpful and what precautions should be taken.
Consider why flexibility might be needed despite risks.
You got /4 concepts.
Practice
(1/5)
1. What does reflection in C# allow a program to do that bypasses compile-time safety?
easy
A. Generate compile-time warnings for unsafe code
B. Automatically optimize code for better performance
C. Inspect and modify types and members at runtime, ignoring compile-time checks
D. Prevent runtime errors by enforcing strict type checks
Solution
Step 1: Understand reflection capabilities and identify how compile-time safety is bypassed
Reflection allows a program to look at its own structure and change it while running, which is not checked at compile time. Because reflection works at runtime, it can access private members and change types without compile-time type checking.
Final Answer:
Inspect and modify types and members at runtime, ignoring compile-time checks -> Option C
Quick Check:
Reflection bypasses compile-time safety = D [OK]
Hint: Reflection works at runtime, ignoring compile-time checks [OK]
Common Mistakes:
Thinking reflection improves compile-time safety
Confusing reflection with compile-time code generation
Assuming reflection prevents runtime errors
2. Which of the following C# code snippets correctly uses reflection to get the name of a private field called _secret from a class MyClass?
easy
A. var field = typeof(MyClass).GetMethod("_secret", BindingFlags.NonPublic);
B. var field = typeof(MyClass).GetField("_secret");
C. var field = typeof(MyClass).GetProperty("_secret", BindingFlags.Public);
D. var field = typeof(MyClass).GetField("_secret", BindingFlags.NonPublic | BindingFlags.Instance);
Solution
Step 1: Identify correct reflection method for fields and use correct BindingFlags for private instance fields
To get a field, use GetField, not GetProperty or GetMethod. Private fields require BindingFlags.NonPublic and BindingFlags.Instance to be accessed.
Final Answer:
var field = typeof(MyClass).GetField("_secret", BindingFlags.NonPublic | BindingFlags.Instance); -> Option D
Quick Check:
Correct BindingFlags for private field = A [OK]
Hint: Use BindingFlags.NonPublic | BindingFlags.Instance for private fields [OK]
Common Mistakes:
Omitting BindingFlags causing null result
Using GetProperty instead of GetField
Using BindingFlags.Public for private members
3. Consider this C# code snippet using reflection:
class Person { private int age = 30; }
var p = new Person();
var field = typeof(Person).GetField("age", BindingFlags.NonPublic | BindingFlags.Instance);
field.SetValue(p, 40);
Console.WriteLine(field.GetValue(p));
What will be the output when this code runs?
medium
A. 40
B. 30
C. Compilation error
D. Runtime exception
Solution
Step 1: Understand reflection access to private field and trace the value change and output
The code uses reflection with correct BindingFlags to access and modify the private field age. The field value is set to 40, then retrieved and printed, so output is 40.
Final Answer:
40 -> Option A
Quick Check:
Reflection sets private field value = 40 [OK]
Hint: Reflection can change private fields at runtime [OK]
Common Mistakes:
Assuming private fields cannot be changed
Expecting compile-time error
Thinking output remains original value
4. This code attempts to use reflection to invoke a private method Calculate in class Calculator. What is the error and how to fix it?
var calc = new Calculator();
var method = typeof(Calculator).GetMethod("Calculate");
method.Invoke(calc, null);
medium
A. GetMethod returns null because it needs BindingFlags.NonPublic; fix by adding BindingFlags.NonPublic | BindingFlags.Instance
B. Invoke requires parameters array; fix by passing new object[] { }
C. Calculator class must be public; fix by making class public
D. Calculate method must be static; fix by declaring static
Solution
Step 1: Identify why GetMethod returns null and fix by adding correct BindingFlags
By default, GetMethod only finds public methods. Private methods require BindingFlags.NonPublic and BindingFlags.Instance. Use GetMethod("Calculate", BindingFlags.NonPublic | BindingFlags.Instance) to find the private method.
Final Answer:
GetMethod returns null because it needs BindingFlags.NonPublic; fix by adding BindingFlags.NonPublic | BindingFlags.Instance -> Option A
Quick Check:
Missing BindingFlags causes null method = A [OK]
Hint: Add BindingFlags.NonPublic to access private methods [OK]
Common Mistakes:
Not using BindingFlags.NonPublic
Passing null instead of empty object array to Invoke
Assuming method must be static
5. You want to use reflection to dynamically create an instance of a class named Plugin and call its private method Initialize. Which sequence of reflection calls correctly bypasses compile-time safety to achieve this?
hard
A. Use typeof(Plugin).GetConstructor(null).Invoke(null) then GetMethod("Initialize") without BindingFlags
B. Use Activator.CreateInstance(typeof(Plugin)) then GetMethod("Initialize", BindingFlags.NonPublic | BindingFlags.Instance) and invoke it
C. Use new Plugin() then call Initialize() directly
D. Use Activator.CreateInstance("Plugin") then GetMethod("Initialize", BindingFlags.Public)
Solution
Step 1: Create instance dynamically, access private method with correct BindingFlags, and invoke the private method
Activator.CreateInstance(typeof(Plugin)) creates an instance at runtime without compile-time type knowledge. GetMethod with BindingFlags.NonPublic | BindingFlags.Instance accesses the private Initialize method. Invoke calls the method on the created instance, bypassing compile-time safety.
Final Answer:
Use Activator.CreateInstance(typeof(Plugin)) then GetMethod("Initialize", BindingFlags.NonPublic | BindingFlags.Instance) and invoke it -> Option B
Quick Check:
Dynamic instance + private method access = C [OK]
Hint: Use Activator + BindingFlags.NonPublic to call private methods [OK]
Common Mistakes:
Calling private method without BindingFlags.NonPublic
Using new instead of Activator for dynamic creation
Wrong BindingFlags causing method not found
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.