Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Provide System.Reflection.Context package readme #106398

Merged
merged 1 commit into from
Aug 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 133 additions & 0 deletions src/libraries/System.Reflection.Context/src/PACKAGE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
## About

Provides the `CustomReflectionContext` class to enable adding or removing custom attributes from reflection objects, or adding dummy properties to those objects, without re-implementing the complete reflection model.

## Key Features

<!-- The key features of this package -->

* Create a custom reflection context to control how types and members are presented during reflection.
* Easily extend or customize the reflection model to fit specialized application needs.

## How to Use

<!-- A compelling example on how to use this package with code, as well as any specific guidelines for when to use the package -->

Defining a custom `Attribute` and implement a `CustomReflectionContext` to add the attribute to specic methods.

```csharp
using System.Reflection;
using System.Reflection.Context;

[AttributeUsage(AttributeTargets.Method)]
class CustomAttribute : Attribute
{
}

class CustomContext : CustomReflectionContext
{
// Called whenever the reflection context checks for custom attributes.
protected override IEnumerable<object> GetCustomAttributes(MemberInfo member, IEnumerable<object> declaredAttributes)
{
// Add custom attribute to "ToString" members
if (member.Name == "ToString")
{
yield return new CustomAttribute();
}

// Keep existing attributes as well
foreach (var attr in declaredAttributes)
{
yield return attr;
}
}
}
```

Inspecting the `string` type with both the default and custom reflection context.

```csharp
Type type = typeof(string);

// Representation of the type in the default reflection context
TypeInfo typeInfo = type.GetTypeInfo();

Console.WriteLine("\"To*\" members and their attributes in the default reflection context");
foreach (MemberInfo memberInfo in typeInfo.DeclaredMembers)
{
if (memberInfo.Name.StartsWith("To"))
{
Console.WriteLine(memberInfo.Name);
foreach (Attribute attribute in memberInfo.GetCustomAttributes())
{
Console.WriteLine($" - {attribute.GetType()}");
}
}
}
Console.WriteLine();

// Output:
// "To*" members and their attributes in the default reflection context
// ToCharArray
// ToCharArray
// ToString
// ToString
// ToLower
// ToLower
// ToLowerInvariant
// ToUpper
// ToUpper
// ToUpperInvariant

// Representation of the type in the customized reflection context
CustomContext customContext = new();
TypeInfo customTypeInfo = customContext.MapType(typeInfo);

Console.WriteLine("\"To*\" members and their attributes in the customized reflection context");
foreach (MemberInfo memberInfo in customTypeInfo.DeclaredMembers)
{
if (memberInfo.Name.StartsWith("To"))
{
Console.WriteLine(memberInfo.Name);
foreach (Attribute attribute in memberInfo.GetCustomAttributes())
{
Console.WriteLine($" - {attribute.GetType()}");
}
}
}

// Output:
// "To*" members and their attributes in the customized reflection context
// ToCharArray
// ToCharArray
// ToString
// - CustomAttribute
// ToString
// - CustomAttribute
// ToLower
// ToLower
// ToLowerInvariant
// ToUpper
// ToUpper
// ToUpperInvariant
```
## Main Types

<!-- The main types provided in this library -->

The main type provided by this library is:

* `System.Reflection.Context.CustomReflectionContext`

## Additional Documentation

<!-- Links to further documentation. Remove conceptual documentation if not available for the library. -->

* [API documentation](https://learn.microsoft.com/dotnet/api/system.reflection.context)

## Feedback & Contributing

<!-- How to provide feedback on this package and contribute to it -->

System.Reflection.Context is released as open source under the [MIT license](https://licenses.nuget.org/MIT).
Bug reports and contributions are welcome at [the GitHub repository](https://github.com/dotnet/runtime).
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,7 @@
<IsPackable>true</IsPackable>
<AddNETFrameworkPlaceholderFileToPackage>true</AddNETFrameworkPlaceholderFileToPackage>
<AddNETFrameworkAssemblyReferenceToPackage>true</AddNETFrameworkAssemblyReferenceToPackage>
<PackageDescription>Provides classes that enable customized reflection contexts.

Commonly Used Types:
System.Reflection.Context.CustomReflectionContext</PackageDescription>
<!-- TODO: Add package README file: https://github.com/dotnet/runtime/issues/99358 -->
<EnableDefaultPackageReadmeFile>false</EnableDefaultPackageReadmeFile>
<PackageDescription>Provides CustomReflectionContext to enable customized reflection contexts.</PackageDescription>
</PropertyGroup>

<!-- DesignTimeBuild requires all the TargetFramework Derived Properties to not be present in the first property group. -->
Expand Down
Loading