📖 Scenario: Imagine you are building a simple library system. You want to mark some classes with special notes using custom tags called attributes. These tags will help you add extra information to your classes, like marking a class as "Important" or "Deprecated".
🎯 Goal: You will create a custom attribute class, apply it to a book class, and then read the attribute information using code.
📋 What You'll Learn
Create a custom attribute class called InfoAttribute with a string property Note.
Create a class called Book and apply the InfoAttribute with a note.
Write code to read and print the Note from the InfoAttribute applied to the Book class.
💡 Why This Matters
🌍 Real World
Custom attributes are used to add extra information to code elements, which can be read at runtime to change behavior or provide metadata.
💼 Career
Understanding custom attributes is useful for working with frameworks, libraries, and tools that use metadata, such as serialization, validation, or documentation generation.
Progress0 / 4 steps
1
Create the custom attribute class
Create a public class called InfoAttribute that inherits from System.Attribute. Add a public string property called Note with a getter and setter.
C Sharp (C#)
Hint
Remember, custom attributes must inherit from System.Attribute. Use public string Note { get; set; } to create the property.
2
Create the Book class and apply the attribute
Create a public class called Book. Apply the InfoAttribute to the Book class with the note set to "This is an important class".
C Sharp (C#)
Hint
Use square brackets [] to apply the attribute above the class. Set the Note property inside the parentheses.
3
Write code to read the attribute
Write code to get the InfoAttribute applied to the Book class using typeof(Book).GetCustomAttributes(typeof(InfoAttribute), false). Store the first attribute in a variable called infoAttr of type InfoAttribute.
C Sharp (C#)
Hint
Use GetCustomAttributes on the Book type to get the attributes. Cast the first attribute to InfoAttribute.
4
Print the note from the attribute
Add a Console.WriteLine statement to print the Note property of infoAttr inside the Main method.
C Sharp (C#)
Hint
Use Console.WriteLine(infoAttr.Note); to show the note on the screen.
Practice
(1/5)
1. What is the main purpose of creating a custom attribute class in C#?
easy
A. To create a new data type for variables
B. To replace the main class in a program
C. To add extra information to code elements like classes or methods
D. To handle exceptions automatically
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 C
Quick Check:
Custom attributes = extra info [OK]
Hint: Attributes add info to code elements, not change logic [OK]
Common Mistakes:
Thinking attributes replace classes
Confusing attributes with data types
Assuming attributes handle errors
2. Which of the following is the correct way to declare a custom attribute class named InfoAttribute?
easy
A. public struct InfoAttribute : Attribute {}
B. public attribute InfoAttribute {}
C. public class InfoAttribute extends Attribute {}
D. public class InfoAttribute : System.Attribute {}
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 D
Quick Check:
Custom attribute = class + : System.Attribute [OK]
Hint: Custom attributes are classes inheriting System.Attribute [OK]
Common Mistakes:
Using 'attribute' keyword instead of 'class'
Using Java syntax 'extends' instead of ':'
Declaring attribute as struct
3. What will be the output of the following code?
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");
}
}
medium
A. Version 1.0
B. No attribute
C. Compilation error
D. Runtime exception
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 A
Quick Check:
Reflection finds attribute version = Version 1.0 [OK]
Hint: Reflection reads attribute properties if applied [OK]
Common Mistakes:
Assuming attribute is not found
Confusing attribute class with target class
Forgetting to cast attribute before accessing property
4. Identify the error in this custom attribute declaration:
public class MyAttribute
{
public string Name { get; set; }
public MyAttribute(string name) { Name = name; }
}
medium
A. Missing inheritance from System.Attribute
B. Property Name should be private
C. Constructor should not have parameters
D. Class should be declared as struct
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 A
Quick Check:
Attributes must inherit System.Attribute [OK]
Hint: Always inherit System.Attribute for custom attributes [OK]
Common Mistakes:
Forgetting to inherit System.Attribute
Thinking constructor must be parameterless
Using struct instead of class
5. You want to create a custom attribute 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?
hard
A. [AttributeUsage(AttributeTargets.Class)]
public class PriorityAttribute : Attribute
{
public int Level;
public PriorityAttribute(int level) { Level = level; }
}
B. [AttributeUsage(AttributeTargets.Method)]
public class PriorityAttribute : Attribute
{
public int Level { get; }
public PriorityAttribute(int level) => Level = level;
}
C. public class PriorityAttribute : Attribute
{
public int Level { get; set; }
public PriorityAttribute() {}
}
D. [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public struct PriorityAttribute
{
public int Level;
public PriorityAttribute(int level) { Level = level; }
}
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 B
Quick Check:
AttributeUsage + class + constructor with param = [AttributeUsage(AttributeTargets.Method)]
public class PriorityAttribute : Attribute
{
public int Level { get; }
public PriorityAttribute(int level) => Level = level;
} [OK]
Hint: Use AttributeUsage to limit targets and inherit Attribute [OK]
Common Mistakes:
Using struct instead of class
Wrong AttributeTargets in AttributeUsage
Missing constructor parameter for priority
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.