Bir nesneye, bir methoda, bir özelliğe ilave bir nitelik katmamızı sağlayan yapılardır. Attribute, abstract bir sınıftır. Niteliklerin en önemli özelliği, üretilen assembly içerisinde yer alan tip ve üyelere ekstra bilgiler katabilmeleridir. Bir başka deyişle metadata içerisine ilave bilgiler eklenebilmesini sağlamaktadır. Çalışma zamanında(runtime) herhangi bir tipin ve üyelerinin hakkında bilgi sahibi olabilme imkanı aynı zamanda metadata içeriğinide elde edebilme anlamına gelmektedir.
Örnek üzerinden detaylıca inceleyelim…
Customer ve CustomerOperation class’ı oluşturalım. Add() metodu ile müşteri ekleyelim.
class Customer
{
public int Number { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
class CustomerOperation
{
public static void Add(Customer customer)
{
Console.WriteLine("{0},{1},{2},{3} added!",
customer.Number, customer.FirstName, customer.LastName, customer.Age);
}
}
static void Main(string[] args)
{ Customer customer = new Customer { Number = 1, LastName = "Çiçek", Age = 23 };
CustomerOperation.Add(customer);
}

Müşteri eklenirken name ve surname alanının zorunlu olmasını istersek bir attribute kullanabiliriz. RequiredPropertyAttribute isminde attribute oluşturmak için Attribute class’ından türetilmesi gerekmektedir. Aşağıdaki şekilde property’nin üstüne eklenmelidir.
class Customer
{
public int Number { get; set; }
[RequiredPropertyAttribute]
public string FirstName { get; set; }
[RequiredPropertyAttribute]
public string LastName { get; set; }
public int Age { get; set; }
}
class RequiredPropertyAttribute :Attribute
{
}
Customer nesnesinin name ve surname property’lerini için bir kural yazmış oluyoruz. Kendimiz oluşturduğumuz gibi C#’ta bulunan hazır attribute’ları da kullanabiliriz. En sık kullanılan Attribute örnekleri :
DebuggerDisplay : Hata ayıklama sırasında Type örneğinin üzerine fareyle geldiğinizde bir Type’ın özelleştirilmiş çıktısını hızlı bir şekilde görmek gerçekten yardımcı olur.
[DebuggerDisplay("FirstName={FirstName}, LastName={LastName}")]
class Customer
{
public string FirstName;
public string LastName;
}
Obsolete : Kullanımdan kaldırılmış bir türü veya üyeyi işaretler. Diğer programcılar böyle bir öğeyi kullanmaya çalışırlarsa, yollarının hatasını açıklayan bir derleyici uyarısı alacaklardır.
[Obsolete("Bu method v4.5 versiyonundan itibaren kaldırılacak, ConnectedNew() methodunu kullanın.]
public void Connected()
{
///
}
Serializable : Bir sınıfı veya yapıyı “seri hale getirilebilir” olarak işaretler, yani mevcut durumunu bir akışta sürdürebilir. Bu özelliği verdiğimizde dönen bir sp sonucunu aşağıdaki class tipine çevirebiliriz.
[Serializable]
public class ProfitabilityGraphDataResponseDto : BaseResponseDto
{
public string ItemName { get; set; }
public string ItemCurrency { get; set; }
}
public static T GetResponse<T>(SpCall sp)
{
var res = string.Empty; ;
using (IForaDb db = Services.Create<IForaDb>())
{
var dr = db.ExecuteReader(sp);
if (!dr.HasRows)
return default(T);
dr.Read();
res = dr.GetString(0);
if (string.IsNullOrWhiteSpace(res))
return default(T);
}
return JsonConvert.DeserializeObject<T>(res);
}
//Kullanımı:
return GetResponse<List<ProfitabilityGraphDataResponseDto>>(sp);
WebMethod : ASP.NET kullanılarak oluşturulan bir XML Web hizmeti içindeki bir yönteme bu özniteliği eklemek, yöntemi uzak Web istemcilerinden çağrılabilir hale getirir.
$.ajax({
type: "POST",
url: '/Default.aspx/TestMethod',
data: '{message: "HAI" }',
contentType: "application/json; charset=utf-8",
success: function (data) {
console.log(data);
},
failure: function (response) {
alert(response.d);
}
});
[WebMethod]
public static string TestMethod(string message)
{
return "The message" + message;
}