Научиться использовать атрибуты классов в C# для добавления метаданных к коду, а также применять рефлексию для анализа этих атрибутов во время выполнения.
Ключевые навыки:
System.Reflection
и System.Attribute
.Необходимо создать программу, которая:
DisplayNameAttribute
, который хранит отображаемое имя класса/метода/свойства.VersionAttribute
, который указывает версию класса в формате Major.Minor
(например, 1.0
).SampleClass
, помеченный этими атрибутами.ReflectionHelper.PrintTypeInfo
, который анализирует переданный тип и выводит:
DisplayName
).Version
).DisplayName
(если есть).Ознакомбтесь с источниками, указанными в списке литературы, коотрый указан в конце данного задания.
Создайте проект, содержащий следующие тесты:
using Xunit;
public class AttributeReflectionTests
{
[Fact]
public void Class_HasDisplayNameAttribute()
{
var type = typeof(SampleClass);
var attribute = type.GetCustomAttribute<DisplayNameAttribute>();
Assert.NotNull(attribute);
Assert.Equal("Пример класса", attribute.DisplayName);
}
[Fact]
public void Method_HasDisplayNameAttribute()
{
var method = typeof(SampleClass).GetMethod("TestMethod");
var attribute = method.GetCustomAttribute<DisplayNameAttribute>();
Assert.NotNull(attribute);
Assert.Equal("Тестовый метод", attribute.DisplayName);
}
[Fact]
public void Property_HasDisplayNameAttribute()
{
var prop = typeof(SampleClass).GetProperty("Number");
var attribute = prop.GetCustomAttribute<DisplayNameAttribute>();
Assert.NotNull(attribute);
Assert.Equal("Числовое свойство", attribute.DisplayName);
}
[Fact]
public void Class_HasVersionAttribute()
{
var type = typeof(SampleClass);
var attribute = type.GetCustomAttribute<VersionAttribute>();
Assert.NotNull(attribute);
Assert.Equal(1, attribute.Major);
Assert.Equal(0, attribute.Minor);
}
}
DisplayNameAttribute
.VersionAttribute
.Создайте класс SampleClass, помеченный атрибутами DisplayNameAttribute
и VersionAttribute
.
ReflectionHelper
.Официальная документация Microsoft:
Тестирование:
Дополнительные материалы: