Yanıtlar:
Nitelikler bir dizi alacaktır. Özniteliği kontrol ediyorsanız, params
bunun yerine de kullanabilirsiniz (tüketiciler için daha hoş, IMO):
class MyCustomAttribute : Attribute {
public int[] Values { get; set; }
public MyCustomAttribute(params int[] values) {
this.Values = values;
}
}
[MyCustomAttribute(3, 4, 5)]
class MyClass { }
Dizi oluşturma sözdiziminiz şu anda kapalı:
class MyCustomAttribute : Attribute {
public int[] Values { get; set; }
public MyCustomAttribute(int[] values) {
this.Values = values;
}
}
[MyCustomAttribute(new int[] { 3, 4, 5 })]
class MyClass { }
Yapabilirsiniz, ancak CLS uyumlu değildir:
[assembly: CLSCompliant(true)]
class Foo : Attribute
{
public Foo(string[] vals) { }
}
[Foo(new string[] {"abc","def"})]
static void Bar() {}
Şovlar:
Warning 1 Arrays as attribute arguments is not CLS-compliant
Düzenli yansıma kullanımı için birden çok özelliğe sahip olmak tercih edilebilir, yani
[Foo("abc"), Foo("def")]
Ancak, bu , herhangi bir özniteliğin yalnızca tek bir örneğinin desteklendiği TypeDescriptor
/ ile çalışmaz PropertyDescriptor
(ilk veya son kazanır, hangisini hatırlayamıyorum).
Yapıcıyı şu şekilde bildirmeyi deneyin:
public class MyCustomAttribute : Attribute
{
public MyCustomAttribute(params int[] t)
{
}
}
O zaman bunu şu şekilde kullanabilirsiniz:
[MyCustomAttribute(3, 4, 5)]
Bu tamam olmalı. Spesifikasyondan bölüm 17.2:
Aşağıdaki ifadelerin tümü doğruysa , E ifadesi bir öznitelik-bağımsız değişken-ifadesidir :
İşte bir örnek:
using System;
[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)]
public class SampleAttribute : Attribute
{
public SampleAttribute(int[] foo)
{
}
}
[Sample(new int[]{1, 3, 5})]
class Test
{
}
Evet, ancak geçmekte olduğunuz diziyi başlatmanız gerekiyor. Burada, değişken sayıda komut satırı seçeneklerini test eden birim testlerimizde bir satır testinden bir örnek var;
[Row( new[] { "-l", "/port:13102", "-lfsw" } )]
public void MyTest( string[] args ) { //... }
Marc Gravell'in cevabına geri dönmek için, evet, dizi parametreleriyle bir öznitelik tanımlayabilirsiniz, ancak bir dizi parametresiyle bir öznitelik uygulamak CLS uyumlu değildir. Bununla birlikte, bir dizi özelliğine sahip bir özniteliği tanımlamak tamamen CLS uyumludur.
Bunu fark etmemi sağlayan şey, CLS uyumlu bir kitaplık olan Json.NET'in, bir nesne dizisi olan ItemConverterParameters adlı bir özelliğe sahip bir JsonPropertyAttribute öznitelik sınıfına sahip olmasıdır.