| name | metalama-2026.0 |
| description | Complete Metalama documentation for aspect-oriented programming in C#. Use when writing aspects, templates, fabrics, or meta-programming code with Metalama. |
Metalama Documentation Skill
This skill contains the complete Metalama documentation including conceptual guides, API reference, and sample code.
This skill pertains to Metalama 2026.0.
Directory Structure
| Directory | Contents |
|---|---|
content/conceptual/ |
Conceptual documentation (aspects, templates, fabrics, validation, etc.) |
content/patterns/ |
Pattern libraries (contracts, caching, observability, memoization, DI) |
content/api/ |
API documentation overview pages |
code/ |
Sample code (.cs = source, .t.cs = transformed output, .Aspect.cs = aspect implementation) |
api/ |
API reference YML files from DocFx |
Finding Information
- Search the index: Use grep with
-B3to search index.yml for keywords (each entry has: name, path, summary, keywords - so-B3captures the path):grep -i -B3 "caching" index.yml grep -i -B3 "BuildAspect" index.yml - Browse by topic: Navigate the
content/directory structure. - API lookup: Use grep on
api/.manifestto find API YML files by type or member name:grep -i "OverrideMethodAspect" api/.manifest
Key Entry Points
| Topic | File | Description |
|---|---|---|
| Getting Started | content/conceptual/using/using-metalama.md |
How to use Metalama in your projects |
| Creating Aspects | content/conceptual/aspects/aspects.md |
Overview of aspect creation |
| Overriding Methods | content/conceptual/aspects/simple-aspects/overriding-methods.md |
Basic method interception |
| Templates | content/conceptual/aspects/templates/templates.md |
T# template syntax and patterns |
| Fabrics | content/conceptual/using/fabrics/fabrics.md |
Bulk aspect application |
| Contracts | content/patterns/contracts/contract-patterns.md |
Parameter/property validation |
| Caching | content/patterns/caching/caching.md |
Method result caching |
| Observability | content/patterns/observability/observability.md |
INotifyPropertyChanged implementation |
| Debugging Aspects | content/conceptual/aspects/testing/debugging-aspects.md |
Debug compile-time code, breakpoints, meta.DebugBreak() |
| Debugging User Code | content/conceptual/using/debugging-aspect-oriented-code.md |
Debug run-time transformed code, LamaDebug configuration |
Common Patterns
Base Classes
| Base Class | Target | Key Override | Use When |
|---|---|---|---|
OverrideMethodAspect |
Methods | OverrideMethod() |
Wrap/intercept methods |
OverrideFieldOrPropertyAspect |
Fields/Properties | OverrideProperty |
Wrap property access |
ContractAspect |
Parameters/Fields/Properties | Validate(dynamic? value) |
Validate values |
TypeAspect |
Types | BuildAspect() |
Introduce members, implement interfaces |
MethodAspect |
Methods | BuildAspect() |
Programmatic method transformation |
TypeFabric |
Single type | AmendType() |
Bulk changes to one type |
ProjectFabric |
Project | AmendProject() |
Apply aspects across project |
Template Fundamentals
[!IMPORTANT] T# templates look like C# but have different semantics. Code that works in normal C# may not work identically in a template. Always read the full template documentation at
content/conceptual/aspects/templates/before writing template code.
public override dynamic? OverrideMethod()
{
// Pre-logic
try
{
return meta.Proceed(); // Calls original method
}
finally
{
// Post-logic (always runs)
}
}
dynamic?handles any return type (void returns null)meta.Proceed()auto-transforms toawaitfor async targets- Use
meta.Target.*to access compile-time information about the target declaration - To debug templates, use
meta.DebugBreak()(notDebugger.Break())
Debugging Quick Reference
Debugging compile-time code (aspects, fabrics, templates):
- Add
Debugger.Break()inBuildAspect/fabrics, ormeta.DebugBreak()in templates - Build with:
dotnet build -p:MetalamaDebugCompiler=True -p:MetalamaConcurrentBuildEnabled=False - Attach debugger when prompted, then set breakpoints in transformed code (
obj/.../metalama/)
Debugging run-time code (transformed output):
- Create a
LamaDebugbuild configuration in Visual Studio - Use
F11to step into code, or addDebugger.Break() - Set breakpoints in transformed files under
obj/<Config>/<TFM>/metalama/
Common Pitfalls
| Mistake | Correct Approach |
|---|---|
Using Debugger.Break() in templates |
Use meta.DebugBreak() in templates; Debugger.Break() only works in BuildAspect and fabrics |
| Setting breakpoints in source files | Breakpoints don't work in Metalama-transformed projects; use Debugger.Break()/meta.DebugBreak() then set breakpoints in transformed code |
Using nameof() for introduced members |
Use string literals; nameof() resolves at aspect compile-time, not target compile-time |
| Filtering all types by namespace in fabrics | Use GlobalNamespace.GetDescendant("Ns") or a NamespaceFabric instead of SelectTypes().Where(t => t.Namespace...) |
Forgetting partial on target classes |
Classes receiving introduced members need the partial modifier |
Sample Code Conventions
Name.cs- Target code receiving the aspectName.Aspect.cs- Aspect implementationName.t.cs- Transformed output (what the compiler generates)Name.Dependency.cs- Referenced project code for multi-project examples
Metalama Markdown Directives
The documentation uses custom [!metalama-*] directives to include code samples. These are processed at build time to generate HTML, but in the skill files you see the raw directives.
Reading Directive References
When you see a directive in a Markdown file, extract the file path and read the referenced file directly.
| Directive | Purpose | Example |
|---|---|---|
[!metalama-file PATH] |
Shows a single source file | [!metalama-file ~/code/Project/File.cs] |
[!metalama-test PATH] |
Shows test with input/output | [!metalama-test ~/code/Project/Test.cs] |
[!metalama-compare PATH] |
Shows side-by-side diff | [!metalama-compare ~/code/Project/File.cs] |
[!metalama-vimeo ID] |
Embeds Vimeo video | [!metalama-vimeo 842168905] |
Path Resolution
~/resolves to the SKILLS.md directory- Example:
~/code/Metalama.Documentation.SampleCode.AspectFramework/GettingStarted/GettingStarted.cs→ Readcode/Metalama.Documentation.SampleCode.AspectFramework/GettingStarted/GettingStarted.cs
How to Read Referenced Code
When you encounter a directive like [!metalama-file ~/code/Project/File.cs]:
- Read the main file:
code/Project/File.cs - Check for related files (same name, different suffix):
File.Aspect.cs- Aspect implementationFile.t.cs- Transformed outputFile.Fabric.cs- Fabric code
Markers: If you see marker="NAME", look for code between // [<snippet NAME>] and // [<endsnippet NAME>] in the file.
API Reference
The api/ directory contains DocFx-generated YML files for all public APIs.
Finding API Documentation
Use api/.manifest - a JSON index mapping all UIDs (types, members, overloads) to their YML files.
Search the manifest for the type or member name:
"Metalama.Framework.Aspects.OverrideMethodAspect": "Metalama.Framework.Aspects.OverrideMethodAspect.yml" "Metalama.Framework.Aspects.OverrideMethodAspect.OverrideMethod": "Metalama.Framework.Aspects.OverrideMethodAspect.yml" "Metalama.Framework.Code.IMethod": "Metalama.Framework.Code.IMethod.yml"Read the corresponding YML file to get full documentation.
Naming conventions:
- Types:
Namespace.TypeName.yml - Generic types: backtick becomes dash, e.g.,
IAspectBuilder<T>→Metalama.Framework.Aspects.IAspectBuilder-1.yml - All members of a type are in the same YML file as the type
- Types:
YML File Structure
Each type's YML file contains all members of that type in a single file:
items:
- uid: Namespace.TypeName # Type definition
commentId: T:Namespace.TypeName
type: Class|Interface|Enum|...
summary: Type description
remarks: Detailed explanation
syntax:
content: public class TypeName : BaseClass
children: # List of member UIDs
- Namespace.TypeName.Method1
- Namespace.TypeName.Property1
- uid: Namespace.TypeName.Method1 # Member definition
commentId: M:Namespace.TypeName.Method1
type: Method|Property|Field|...
summary: Member description
syntax:
content: public void Method1()
parameters: [...] # For methods
return: { type: ..., description: ... }
Key Namespaces
| Namespace | Purpose |
|---|---|
Metalama.Framework.Aspects |
Aspect base classes, attributes, meta API |
Metalama.Framework.Code |
Code model interfaces (IMethod, IType, IParameter, etc.) |
Metalama.Framework.Advising |
Advice APIs for introducing members, implementing interfaces |
Metalama.Framework.Eligibility |
Eligibility builders for aspect targeting |
Metalama.Framework.Diagnostics |
Reporting warnings and errors |
Metalama.Framework.Fabrics |
Fabric base classes |
Metalama.Patterns.Contracts |
Contract validation aspects |
Metalama.Patterns.Caching |
Caching aspects and configuration |
Metalama.Patterns.Observability |
INotifyPropertyChanged implementation |
Metalama.Extensions.DependencyInjection |
Dependency injection |
Metalama.Extensions.Architecture |
Architecture enforcement/validation |
Linking to Documentation
When referencing documentation articles, provide links to the live documentation at https://doc.metalama.net.
URL format: https://doc.metalama.net/<path> where <path> is derived from the file path under content/:
- Remove
content/prefix - Remove
.mdsuffix - For index files where the filename matches the parent folder (e.g.,
path/leaf/leaf.md), use justpath/leaf
Examples:
| File Path | URL |
|---|---|
content/conceptual/aspects/aspects.md |
https://doc.metalama.net/conceptual/aspects |
content/conceptual/aspects/templates/templates.md |
https://doc.metalama.net/conceptual/aspects/templates |
content/patterns/caching/caching.md |
https://doc.metalama.net/patterns/caching |
content/conceptual/aspects/simple-aspects/overriding-methods.md |
https://doc.metalama.net/conceptual/aspects/simple-aspects/overriding-methods |
External Resources
- Live documentation: https://doc.metalama.net
- Source repository: https://github.com/metalama/Metalama
- Samples repository: https://github.com/metalama/Metalama.Samples