What if you could tag your code with secret notes that change how it works without messy changes everywhere?
Why Custom attribute classes in C Sharp (C#)? - Purpose & Use Cases
Imagine you have a big C# program with many classes and methods. You want to add extra information to some parts, like marking which methods need special logging or which classes are for testing. Doing this by writing extra code everywhere or keeping separate notes is confusing and messy.
Manually tracking extra info means you have to change many places in your code. It's easy to forget or make mistakes. Also, your code becomes cluttered with checks and comments that don't belong to the main logic. This slows you down and makes bugs more likely.
Custom attribute classes let you attach neat labels or tags directly to your code parts. These tags carry extra info in a clean way. Later, your program can read these tags to decide what to do, without mixing extra logic everywhere. It keeps your code tidy and powerful.
[Obsolete]
public void OldMethod() { /* ... */ }[MyCustom("NeedsLogging")]
public void ImportantMethod() { /* ... */ }It enables you to add meaningful, reusable metadata to your code that can be checked at runtime or compile time to change behavior smartly.
For example, you can create a custom attribute to mark methods that require security checks, then automatically enforce those checks without changing each method's code.
Custom attributes add extra info cleanly to code elements.
They help separate metadata from main logic.
This makes your code easier to maintain and extend.
Practice
Solution
Step 1: Understand what attributes do
Attributes add metadata, or extra info, to code elements like classes or methods.Step 2: Identify the role of custom attributes
Custom attributes let you define your own extra info to attach to code elements.Final Answer:
To add extra information to code elements like classes or methods -> Option CQuick Check:
Custom attributes = extra info [OK]
- Thinking attributes replace classes
- Confusing attributes with data types
- Assuming attributes handle errors
InfoAttribute?Solution
Step 1: Recall C# syntax for custom attributes
Custom attribute classes must inherit from System.Attribute using a class declaration.Step 2: Check each option
public class InfoAttribute : System.Attribute {} correctly uses 'public class InfoAttribute : System.Attribute {}'. public attribute InfoAttribute {} uses invalid keyword 'attribute'. public class InfoAttribute extends Attribute {} uses 'extends' which is Java syntax. public struct InfoAttribute : Attribute {} uses 'struct' which is not correct for attributes.Final Answer:
public class InfoAttribute : System.Attribute {} -> Option DQuick Check:
Custom attribute = class + : System.Attribute [OK]
- Using 'attribute' keyword instead of 'class'
- Using Java syntax 'extends' instead of ':'
- Declaring attribute as struct
using System;
[Info("Version 1.0")]
class Program {}
public class InfoAttribute : Attribute
{
public string Version { get; }
public InfoAttribute(string version) => Version = version;
}
class Test
{
static void Main()
{
var attrs = typeof(Program).GetCustomAttributes(typeof(InfoAttribute), false);
if (attrs.Length > 0)
Console.WriteLine(((InfoAttribute)attrs[0]).Version);
else
Console.WriteLine("No attribute");
}
}Solution
Step 1: Understand attribute application
The Program class has the Info attribute with version "Version 1.0" applied.Step 2: Check reflection code
The code uses reflection to get InfoAttribute from Program. Since it exists, it prints the Version property.Final Answer:
Version 1.0 -> Option AQuick Check:
Reflection finds attribute version = Version 1.0 [OK]
- Assuming attribute is not found
- Confusing attribute class with target class
- Forgetting to cast attribute before accessing property
public class MyAttribute
{
public string Name { get; set; }
public MyAttribute(string name) { Name = name; }
}Solution
Step 1: Check inheritance requirement
Custom attribute classes must inherit from System.Attribute to be recognized as attributes.Step 2: Analyze given code
The class MyAttribute does not inherit from System.Attribute, so it is not a valid attribute class.Final Answer:
Missing inheritance from System.Attribute -> Option AQuick Check:
Attributes must inherit System.Attribute [OK]
- Forgetting to inherit System.Attribute
- Thinking constructor must be parameterless
- Using struct instead of class
PriorityAttribute that accepts an integer priority level and can be applied only to methods. Which of the following is the correct way to declare it?Solution
Step 1: Check AttributeUsage target
The attribute should apply only to methods, so AttributeTargets.Method is correct.Step 2: Verify class declaration and constructor
It must be a class inheriting Attribute, with a constructor accepting an int and a read-only property.Step 3: Review options
[AttributeUsage(AttributeTargets.Method)] public class PriorityAttribute : Attribute { public int Level { get; } public PriorityAttribute(int level) => Level = level; } matches all requirements. [AttributeUsage(AttributeTargets.Class)] public class PriorityAttribute : Attribute { public int Level; public PriorityAttribute(int level) { Level = level; } } targets classes, not methods. public class PriorityAttribute : Attribute { public int Level { get; set; } public PriorityAttribute() {} } lacks constructor parameter and target restriction. [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)] public struct PriorityAttribute { public int Level; public PriorityAttribute(int level) { Level = level; } } uses struct, which is invalid for attributes.Final Answer:
[AttributeUsage(AttributeTargets.Method)] public class PriorityAttribute : Attribute { public int Level { get; } public PriorityAttribute(int level) => Level = level; } -> Option BQuick Check:
AttributeUsage + class + constructor with param = [AttributeUsage(AttributeTargets.Method)] public class PriorityAttribute : Attribute { public int Level { get; } public PriorityAttribute(int level) => Level = level; } [OK]
- Using struct instead of class
- Wrong AttributeTargets in AttributeUsage
- Missing constructor parameter for priority
Ready to prove it?
Pass the test and this pattern moves unknown
