Reading attributes with reflection in C Sharp (C#) - Time & Space Complexity
When we read attributes using reflection in C#, we want to know how the time it takes changes as the number of attributes or classes grows.
We ask: How does the work increase when we check more attributes or types?
Analyze the time complexity of the following code snippet.
[AttributeUsage(AttributeTargets.Class)]
public class MyAttribute : Attribute { }
public class Example {
public void CheckAttributes(Type[] types) {
foreach (var type in types) {
var attrs = type.GetCustomAttributes(typeof(MyAttribute), false);
// process attrs
}
}
}
This code checks each type in an array to find if it has a specific attribute applied.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Looping through each type and calling
GetCustomAttributesto read attributes. - How many times: Once for each type in the input array.
As the number of types increases, the time to check all attributes grows roughly in direct proportion.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 attribute checks |
| 100 | About 100 attribute checks |
| 1000 | About 1000 attribute checks |
Pattern observation: Doubling the number of types roughly doubles the work done.
Time Complexity: O(n)
This means the time to read attributes grows linearly with the number of types checked.
[X] Wrong: "Reading attributes is instant and does not depend on how many types we check."
[OK] Correct: Each type requires a separate check, so more types mean more work and more time.
Understanding how reflection scales helps you write efficient code and answer questions about performance in real projects.
"What if we cached the attributes after the first read? How would the time complexity change when checking many types repeatedly?"
Practice
Solution
Step 1: Understand what attributes are
Attributes are extra notes or metadata added to code elements like classes or methods.Step 2: Understand reflection's role
Reflection lets you look at these attributes while the program runs, to read their information.Final Answer:
Access extra information added to classes or methods at runtime -> Option AQuick Check:
Reflection reads attributes = Access extra info [OK]
- Thinking reflection changes code instead of reading it
- Confusing attributes with variables or methods
- Believing attributes speed up compilation
Solution
Step 1: Recall the reflection syntax for attributes
In C#, to get attributes of a class, use typeof(ClassName).GetCustomAttributes().Step 2: Check each option
Only typeof(MyClass).GetCustomAttributes() uses the correct syntax with typeof and GetCustomAttributes method.Final Answer:
typeof(MyClass).GetCustomAttributes() -> Option BQuick Check:
Correct syntax uses typeof and GetCustomAttributes() [OK]
- Calling GetAttributes() directly on class name
- Using instance methods instead of typeof
- Confusing method names like Attributes()
[System.Obsolete("Use NewMethod instead")]
class OldClass {}
var attrs = typeof(OldClass).GetCustomAttributes(typeof(System.ObsoleteAttribute), false);
Console.WriteLine(attrs.Length);Solution
Step 1: Identify the attribute applied
The class OldClass has the Obsolete attribute applied once.Step 2: Check GetCustomAttributes call
GetCustomAttributes is called with ObsoleteAttribute type, so it returns an array with that attribute instance.Final Answer:
1 -> Option DQuick Check:
One Obsolete attribute found = 1 [OK]
- Assuming zero because attribute is ignored
- Expecting null instead of empty array
- Thinking it throws exception without reason
class MyClass {}
var attrs = MyClass.GetCustomAttributes();
Console.WriteLine(attrs.Length);Solution
Step 1: Check method call on class
GetCustomAttributes is a method of Type, not the class itself, so calling MyClass.GetCustomAttributes() is invalid.Step 2: Correct usage
You must use typeof(MyClass).GetCustomAttributes() to get attributes via reflection.Final Answer:
GetCustomAttributes is not a method of the class itself -> Option CQuick Check:
Use typeof(Class).GetCustomAttributes() not Class.GetCustomAttributes() [OK]
- Calling GetCustomAttributes directly on class name
- Ignoring that GetCustomAttributes is a Type method
- Assuming attributes exist without checking
InfoAttribute applied to multiple methods in a class and print their descriptions. Which approach correctly reads and prints these descriptions?Solution
Step 1: Identify target elements
The attribute InfoAttribute is applied to methods, so we must get methods via reflection.Step 2: Read attributes per method
For each MethodInfo, call GetCustomAttributes with InfoAttribute type to get the attribute instance and access its Description property.Step 3: Print descriptions
Print the Description property for each method's attribute found.Final Answer:
Use reflection to get MethodInfo array, then for each method call GetCustomAttributes(typeof(InfoAttribute), false) and print the Description property -> Option AQuick Check:
Read attributes per method, not class or fields [OK]
- Reading attributes only on class instead of methods
- Checking fields instead of methods
- Assuming one attribute for whole class
Ready to prove it?
Pass the test and this pattern moves unknown
