Bird
Raised Fist0
C Sharp (C#)programming~5 mins

Custom attribute classes in C Sharp (C#)

Choose your learning style10 modes available
Introduction

Custom attribute classes let you add extra information to your code parts. This helps you mark or describe things in a way your program can read later.

When you want to tag methods with special notes for later use.
When you need to mark classes with extra info for tools or frameworks.
When you want to add metadata to properties to control behavior.
When you want to create your own rules or markers that other code can check.
When you want to keep extra data about code elements without changing their logic.
Syntax
C Sharp (C#)
public class MyAttribute : System.Attribute
{
    // Add properties or fields here
    public string Info { get; set; }

    public MyAttribute(string info)
    {
        Info = info;
    }
}

Custom attribute classes must inherit from System.Attribute.

You can add properties or fields to store extra data inside the attribute.

Examples
This shows how to apply your custom attribute to a class with a string value.
C Sharp (C#)
[MyAttribute("This is a test")]
public class TestClass
{
}
Example of a custom attribute that stores an author's name and applies it to a class.
C Sharp (C#)
public class AuthorAttribute : Attribute
{
    public string Name { get; }
    public AuthorAttribute(string name) => Name = name;
}

[Author("Alice")]
public class Book
{
}
Sample Program

This program defines a custom attribute InfoAttribute with a description. It applies it to a class and a method. Then it reads and prints the descriptions at runtime.

C Sharp (C#)
using System;

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class InfoAttribute : Attribute
{
    public string Description { get; }
    public InfoAttribute(string description) => Description = description;
}

[Info("This class does math operations")]
public class Calculator
{
    [Info("Adds two numbers")]
    public int Add(int a, int b) => a + b;
}

class Program
{
    static void Main()
    {
        var type = typeof(Calculator);
        var classAttr = (InfoAttribute)Attribute.GetCustomAttribute(type, typeof(InfoAttribute));
        Console.WriteLine($"Class info: {classAttr.Description}");

        var method = type.GetMethod("Add");
        var methodAttr = (InfoAttribute)Attribute.GetCustomAttribute(method, typeof(InfoAttribute));
        Console.WriteLine($"Method info: {methodAttr.Description}");
    }
}
OutputSuccess
Important Notes

Use [AttributeUsage] to control where your attribute can be applied (classes, methods, properties, etc.).

Attributes are a way to add metadata, not to change how code works directly.

You can read attribute data at runtime using reflection.

Summary

Custom attribute classes add extra info to code elements.

They must inherit from System.Attribute.

You apply them with square brackets [] and can read them using reflection.

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

  1. Step 1: Understand what attributes do

    Attributes add metadata, or extra info, to code elements like classes or methods.
  2. Step 2: Identify the role of custom attributes

    Custom attributes let you define your own extra info to attach to code elements.
  3. Final Answer:

    To add extra information to code elements like classes or methods -> Option C
  4. 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

  1. Step 1: Recall C# syntax for custom attributes

    Custom attribute classes must inherit from System.Attribute using a class declaration.
  2. 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.
  3. Final Answer:

    public class InfoAttribute : System.Attribute {} -> Option D
  4. 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

  1. Step 1: Understand attribute application

    The Program class has the Info attribute with version "Version 1.0" applied.
  2. Step 2: Check reflection code

    The code uses reflection to get InfoAttribute from Program. Since it exists, it prints the Version property.
  3. Final Answer:

    Version 1.0 -> Option A
  4. 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

  1. Step 1: Check inheritance requirement

    Custom attribute classes must inherit from System.Attribute to be recognized as attributes.
  2. Step 2: Analyze given code

    The class MyAttribute does not inherit from System.Attribute, so it is not a valid attribute class.
  3. Final Answer:

    Missing inheritance from System.Attribute -> Option A
  4. 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

  1. Step 1: Check AttributeUsage target

    The attribute should apply only to methods, so AttributeTargets.Method is correct.
  2. 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.
  3. 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.
  4. Final Answer:

    [AttributeUsage(AttributeTargets.Method)] public class PriorityAttribute : Attribute { public int Level { get; } public PriorityAttribute(int level) => Level = level; } -> Option B
  5. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard