C# Tutorial

C# Tutorial C# First Application C# Variables C# Data Types C# Operators C# Keywords

C# Control Statement

C# If Statements C# Switch Statements C# for Loop C# While Loop C# do While loop C# Jump Statements C# Function C# functions with out variable

C# Arrays

C# Arrays

C# Function

C# Function call by value C# Call by reference C# Passing array to function C# Multidimensional Arrays C# Jagged Arrays C# Params C# Array Class C# Command Line Arguments

C# Object Class

C# Object and Classes C# Constructors C# Destructor C# this Keyword C# static field C# static class C# Static Constructor C# Structs C# enum C# Properties

C# Inheritance

C# Inheritance C# Multilevel Inheritance C# Aggregation C# Member overloading C# Method Overriding C# Base

C# Polymorphism

C# Polymorphism C# Sealed

C# Abstraction

C# Abstraction C# Interface

C# Namespace

C# Namespace C# Access Modifiers C# Encapsulation

C# Strings

C# String

C# Misc

C# Design Patterns Dictionary in C# Boxing and Unboxing in C# Ref and Out in C# Serialization in C# Dispose and Finalize in C# CONSOLE LOG IN C# Get File extension in C# Insert query in c# Difference Between List and Dictionary in C# Getters and Setters in C# Extension Methods in C# Insert query in c# CONSOLE LOG IN C# Get File extension in C# Random.NextDouble() Method in C# Binary Search in C# Difference between Delegates and Interfaces in C# Double.IsFinite() Method in C# Index Constructor in C# Abstraction in C# Basic OOPS Concepts In C# Queue.CopyTo() Method in C# single.compareto() method in C# C# Throw Exception in Constructor DECODE IN C# file.setlastwritetimeutc() method in C# Convert Object to List in C# convert.ToSByte(string, IFormatProvider) Method in C# C# Declare Delegate in Interface console.TreatControl C As Input property in C# Copying the queue elements to 1-D Array in C# Array.Constrainedcopy() Method in C# C# in and out Char.IsLetterOrDigit() method in C# Debugging in C# decimal.compare() method in C# Difference between Console.Read and Console.Readline in C# Metadata in C# C# Event Handler Example Default Interface Methods in C# Difference between hashtable and dictionary in C# C# program to implement IDisposable Interface Encapsulation in C# SortedList.IndexOfVaalue(Object) Method in C# Hash Maps in C# How to clear text files in C# How to Convert xls to xlsx in C# Foreach loop in C# FIFO in C# How to handle null exception in C# Type.Is Instance Of Type() Method in C# How to add data into MySQL database using C# How to use angular js in ASP net Csharp decimal.compare() method in Csharp Difference between Console.Read and Console.Readline in Csharp How to Implement Interface in Csharp char.IsUpper() Method in C# Index Of Any() Method in C# Quantifiers in C# C# program to Get Extension of a Given File C# Error Logging C# ENCRIPTION Can we create an object for Abstract Class in C# Console.CursorVisible in C# SortedDictionary Implementation in C# C# Hash Table with Examples Setting the Location of the Label in c# Collections in c# Virtual Keyword in C# Reverse of string in C# String and StringBuilder in C# Encapsulation in C# SortedList.IndexOfVaalue(Object) Method in C# Hash Maps in C# How to clear text files in C# How to Convert xls to xlsx in C# Foreach loop in C# FIFO in C# How to handle null exception in C# Type.Is Instance Of Type() Method in C# How to add data into MySQL database using C# How to use angular js in ASP net Csharp decimal.compare() method in Csharp Difference between Console.Read and Console.Readline in Csharp How to Implement Interface in Csharp char.IsUpper() Method in C# Index Of Any() Method in C# Quantifiers in C# C# program to Get Extension of a Given File Difference between ref and out in C# Singleton Class in C# Const And Readonly In Csharp BinaryReader and BinaryWriter in C# C# Attributes C# Delegates DirectoryInfo Class in C# Export and Import Excel Data in C# File Class in C# FileInfo Class in C# How to Cancel Parallel Operations in C#? Maximum Degree of Parallelism in C# Parallel Foreach Loop in C# Parallel Invoke in C# StreamReader and StreamWriter in C# TextReader and TextWriter in C# AsQueryable() in C# Basic Database Operations Using C# C# Anonymous Methods C# Events C# Generics C# Indexers C# Multidimensional Indexers C# Multithreading C# New Features C# Overloading of Indexers Difference between delegates and events in C# Operator overloading in C# Filter table in C# C# Queue with Examples C# Sortedlist With Examples C# Stack with Examples C# Unsafe Code File Handling in C# HashSet in C# with Examples List Implementation in C# SortedSet in C# with Examples C# in Depth Delegates and Events in C# Finally Block in C# How to Split String in C# Loggers in C# Nullable Types in C# REVERSE A STRING IN C# TYPE CASTING IN C# What is Generics in C# ABSTRACT CLASS IN C# Application of pointer in C# Await in c# READONLY AND CONSTANT IN C# Type safe in C# Types of Variables in c# Use of delegates in c# ABSTRACT CLASS IN C# Application of pointer in C# Await in c# READONLY AND CONSTANT IN C# Type safe in C# Types of Variables in c# Use of delegates in c# ABSTRACT CLASS IN C# Application of pointer in C# Await in c# READONLY AND CONSTANT IN C# Type safe in C# Types of Variables in c# Use of delegates in c# Atomic Methods Thread Safety and Race Conditions in C# Parallel LINQ in C# Design Principles in C# Difference Between Struct And Class In C# Difference between Abstraction and Encapsulation in C# Escape Sequence Characters in C# What is IOC in C# Multiple Catch blocks in C# Appdomain in C# Call back methods in C# Change Datetime format in C# Declare String array in C# Default Access Specifier in c# Foreach in LINQ C# How to compare two lists in C# How to Convert String to Datetime in c# How to get only Date from DateTime in C# Ispostback in asp net C# JSON OBJECT IN C# JSON STRINGIFY IN C# LAMBDA FUNCTION IN C# LINQ Lambda Expression in C# Microservices in C# MSIL IN C# Reference parameter in C# Shadowing(Method hiding) in C# Solid principles in C# Static Members in C# Task run in C# Transaction scope in C# Type Conversion in c# Unit of Work in C# Unit Test Cases in c# User Defined Exception in c# Using Keyword in C# Var Keyword in C# What is gac in C#

Metadata in C#

Metadata is essential when it comes to providing details about types, members, and other program constructs in C#. Debugging, interoperability, and other aspects of program execution are made possible by metadata, which basically describes the structure and properties of the code. In this article, we will discuss Metadata in C# with its examples.

What is metadata?

As data about data, metadata can be interpreted. When discussing C#, metadata includes the details about the types, members, properties, methods, and other elements that are defined in an assembly .NET framework. The names, signatures, accessibility settings, and connections between the various code components are among the details it includes. 

Support for reflection in metadata allows for dynamic loading and runtime introspection of types and members, which is one of the major advantages of metadata. In order to enable powerful runtime behaviors like generating instances of types, calling methods, accessing properties, and examining attributes, developers can use reflection to find and interact with types and members dynamically.

Within the .NET framework, dynamic behavior, interoperability, and introspection are made possible by the metadata in C#. It supports a broad range of features necessary for creating reliable and expandable applications and encapsulates crucial information about types and members. It also allows for runtime manipulation and interaction.

Example:

Let us take an example to illustrate the Metadata in C#.

using System;

using System.Reflection;

public class MyClass

{

    public int MyProperty { get; set; }

    public void MyMethod()

    {

        Console.WriteLine("Hello from MyMethod!");

    }

}

class Program

{

    static void Main(string[] args)

    {

        // Load the assembly containing MyClass

        Assembly assembly = Assembly.GetExecutingAssembly();

        // Get the metadata for MyClass

        Type myClassType = assembly.GetType("MyClass");

        // Print information about the class

        Console.WriteLine($"Type Name: {myClassType.FullName}");

        Console.WriteLine($"Is Abstract: {myClassType.IsAbstract}");

        Console.WriteLine($"Is Class: {myClassType.IsClass}");

        Console.WriteLine($"Is Public: {myClassType.IsPublic}");

        // Get information about properties

        PropertyInfo[] properties = myClassType.GetProperties();

        Console.WriteLine("\nProperties:");

        foreach (var property in properties)

        {

            Console.WriteLine($"Name: {property.Name}, Type: {property.PropertyType}");

        }

        // Get information about methods

        MethodInfo[] methods = myClassType.GetMethods();

        Console.WriteLine("\nMethods:");

        foreach (var method in methods)

        {

            Console.WriteLine($"Name: {method.Name}, Return Type: {method.ReturnType}");

        }

        // Create an instance of MyClass using reflection

        object myObject = Activator.CreateInstance(myClassType);

        // Invoke a method dynamically

        MethodInfo myMethod = myClassType.GetMethod("MyMethod");

        myMethod.Invoke(myObject, null);

        // Set and get property values dynamically

        PropertyInfo myProperty = myClassType.GetProperty("MyProperty");

        myProperty.SetValue(myObject, 42);

        Console.WriteLine($"MyProperty value: {myProperty.GetValue(myObject)}");

    }

}using System;

using System.Reflection;

public class MyClass

{

    public int MyProperty { get; set; }

    public void MyMethod()

    {

        Console.WriteLine("Hello from MyMethod!");

    }

}

class Program

{

    static void Main(string[] args)

    {

        // Load the assembly containing MyClass

        Assembly assembly = Assembly.GetExecutingAssembly();

        // Get the metadata for MyClass

        Type myClassType = assembly.GetType("MyClass");

        // Print information about the class

        Console.WriteLine($"Type Name: {myClassType.FullName}");

        Console.WriteLine($"Is Abstract: {myClassType.IsAbstract}");

        Console.WriteLine($"Is Class: {myClassType.IsClass}");

        Console.WriteLine($"Is Public: {myClassType.IsPublic}");

        // Get information about properties

        PropertyInfo[] properties = myClassType.GetProperties();

        Console.WriteLine("\nProperties:");

        foreach (var property in properties)

        {

            Console.WriteLine($"Name: {property.Name}, Type: {property.PropertyType}");

        }

        // Get information about methods

        MethodInfo[] methods = myClassType.GetMethods();

        Console.WriteLine("\nMethods:");

        foreach (var method in methods)

        {

            Console.WriteLine($"Name: {method.Name}, Return Type: {method.ReturnType}");

        }

        // Create an instance of MyClass using reflection

        object myObject = Activator.CreateInstance(myClassType);

        // Invoke a method dynamically

        MethodInfo myMethod = myClassType.GetMethod("MyMethod");

        myMethod.Invoke(myObject, null);

        // Set and get property values dynamically

        PropertyInfo myProperty = myClassType.GetProperty("MyProperty");

        myProperty.SetValue(myObject, 42);

        Console.WriteLine($"MyProperty value: {myProperty.GetValue(myObject)}");

    }

}

Output:

Type Name: MyClass

Is Abstract: False

Is Class: True

Is Public: True

Properties:

Name: MyProperty, Type: System.Int32

Methods:

Name: get_MyProperty, Return Type: System.Int32

Name: set_MyProperty, Return Type: System.Void

Name: MyMethod, Return Type: System.Void

Name: Equals, Return Type: System.Boolean

Name: GetHashCode, Return Type: System.Int32

Name: GetType, Return Type: System.Type

Name: ToString, Return Type: System.String

Hello from MyMethod!

MyProperty value: 42

Explanation:

This C# example illustrates how metadata allows for dynamic runtime inspection and interaction with types and members.

  • Loading the assembly that has the MyClass class in it.
  • Retrieving the MyClass type's metadata (through reflection).
  • Printing details about the class's attributes and operations.
  • Using reflection, a dynamic MyClass instance is created.
  • Dynamically calling a method (MyMethod).
  • Dynamically setting and retrieving values for properties (MyProperty).

Example 2:

Let us take another example to illustrate the Metadata in C#.

using System;

using System.Reflection;

// Define a custom attribute

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]

public class MyCustomAttribute : Attribute

{

    public string Description { get; }

    public MyCustomAttribute(string description)

    {

        Description = description;

    }

}

// Apply the custom attribute to a class and its method

[MyCustom("This is a custom attribute applied to MyClass")]

public class MyClass

{

    [MyCustom("This is a custom attribute applied to MyMethod")]

    public void MyMethod()

    {

        Console.WriteLine("Hello from MyMethod!");

    }

}

class Program

{

    static void Main(string[] args)

    {

        // Get the metadata for MyClass

        Type myClassType = typeof(MyClass);

        // Check if the class has MyCustomAttribute

        if (Attribute.IsDefined(myClassType, typeof(MyCustomAttribute)))

        {

            // Retrieve and print the description of MyCustomAttribute applied to the class

            MyCustomAttribute classAttribute = (MyCustomAttribute)Attribute.GetCustomAttribute(myClassType, typeof(MyCustomAttribute));

            Console.WriteLine($"MyClass Attribute: {classAttribute.Description}");

        }

        // Get the metadata for MyMethod

        MethodInfo myMethod = myClassType.GetMethod("MyMethod");

        // Check if the method has MyCustomAttribute

        if (Attribute.IsDefined(myMethod, typeof(MyCustomAttribute)))

        {

            // Retrieve and print the description of MyCustomAttribute applied to the method

            MyCustomAttribute methodAttribute = (MyCustomAttribute)Attribute.GetCustomAttribute(myMethod, typeof(MyCustomAttribute));

            Console.WriteLine($"MyMethod Attribute: {methodAttribute.Description}");

        }

    }

}

Output:

MyClass Attribute: This is a custom attribute applied to MyClass

MyMethod Attribute: This is a custom attribute applied to MyMethod

Conclusion:

A key component of the C# language and runtime environment, metadata allows for dynamic behavior, introspection, and runtime interaction with types and members. Developers can leverage powerful features like reflection and custom attribute usage by having access to structured information about assemblies, types, members, and attributes through metadata.

Using reflection, programs can dynamically inspect and manipulate types and members, facilitating operations like runtime type creation, method invocation, property access, and attribute inspection. This capability makes building adaptable, expandable, and feature-rich applications possible.