La réponse courte est pour créer un attribut en c #, il vous suffit de l'hériter de la classe Attribute, juste ceci :)
Mais ici, je vais expliquer les attributs en détail:
fondamentalement, les attributs sont des classes que nous pouvons les utiliser pour appliquer notre logique aux assemblys, classes, méthodes, propriétés, champs, ...
Dans .Net, Microsoft a fourni des attributs prédéfinis tels que des attributs obsolètes ou de validation tels que ([Obligatoire], [StringLength (100)], [Range (0, 999.99)]), ainsi que des types d'attributs comme ActionFilters dans asp.net qui peut être très utile pour appliquer notre logique souhaitée à nos codes (lisez cet article sur les filtres d'action si vous êtes passionné de l'apprendre)
un autre point, vous pouvez appliquer une sorte de configuration sur votre attribut via AttibuteUsage.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = true)]
Lorsque vous décorez une classe d'attribut avec AttributeUsage, vous pouvez dire au compilateur c # où je vais utiliser cet attribut: je vais l'utiliser sur des classes, sur des assemblys sur des propriétés ou sur ... et mon attribut est autorisé à utiliser plusieurs fois sur des cibles définies (classes, assemblages, propriétés, ...) ou pas?!
Après cette définition des attributs, je vais vous montrer un exemple: imaginez que nous voulons définir une nouvelle leçon à l'université et que nous voulons permettre uniquement aux administrateurs et aux maîtres de notre université de définir une nouvelle leçon, d'accord?
namespace ConsoleApp1
{
/// <summary>
/// All Roles in our scenario
/// </summary>
public enum UniversityRoles
{
Admin,
Master,
Employee,
Student
}
/// <summary>
/// This attribute will check the Max Length of Properties/fields
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = true)]
public class ValidRoleForAccess : Attribute
{
public ValidRoleForAccess(UniversityRoles role)
{
Role = role;
}
public UniversityRoles Role { get; private set; }
}
/// <summary>
/// we suppose that just admins and masters can define new Lesson
/// </summary>
[ValidRoleForAccess(UniversityRoles.Admin)]
[ValidRoleForAccess(UniversityRoles.Master)]
public class Lesson
{
public Lesson(int id, string name, DateTime startTime, User owner)
{
var lessType = typeof(Lesson);
var validRolesForAccesses = lessType.GetCustomAttributes<ValidRoleForAccess>();
if (validRolesForAccesses.All(x => x.Role.ToString() != owner.GetType().Name))
{
throw new Exception("You are not Allowed to define a new lesson");
}
Id = id;
Name = name;
StartTime = startTime;
Owner = owner;
}
public int Id { get; private set; }
public string Name { get; private set; }
public DateTime StartTime { get; private set; }
/// <summary>
/// Owner is some one who define the lesson in university website
/// </summary>
public User Owner { get; private set; }
}
public abstract class User
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime DateOfBirth { get; set; }
}
public class Master : User
{
public DateTime HireDate { get; set; }
public Decimal Salary { get; set; }
public string Department { get; set; }
}
public class Student : User
{
public float GPA { get; set; }
}
class Program
{
static void Main(string[] args)
{
#region exampl1
var master = new Master()
{
Name = "Hamid Hasani",
Id = 1,
DateOfBirth = new DateTime(1994, 8, 15),
Department = "Computer Engineering",
HireDate = new DateTime(2018, 1, 1),
Salary = 10000
};
var math = new Lesson(1, "Math", DateTime.Today, master);
#endregion
#region exampl2
var student = new Student()
{
Name = "Hamid Hasani",
Id = 1,
DateOfBirth = new DateTime(1994, 8, 15),
GPA = 16
};
var literature = new Lesson(2, "literature", DateTime.Now.AddDays(7), student);
#endregion
ReadLine();
}
}
}
Dans le monde réel de la programmation, nous n'utilisons peut-être pas cette approche pour utiliser les attributs et je l'ai dit en raison de son intérêt pédagogique dans l'utilisation des attributs