2009-02-03 16 views

cevap

92

Bu bir CLR kısıtlamasıdır. Özellik parametreleri olarak yalnızca ilkel sabitler veya ilkel diziler kullanılabilir. Nedeni, bir özniteliğin tamamen meta verilerde kodlanması gerektiğidir. Bu, IL'de kodlanmış bir yöntem gövdesinden farklıdır. MetaData'yı kullanmak, yalnızca kullanılabilecek değerlerin kapsamını ciddi biçimde kısıtlar. CLR'nin mevcut sürümünde, meta veri değerleri ilkel, null, ilkel türler ve dizilerle sınırlıdır (küçük olanı kaçırmış olabilir).

Temel türler ilkel türden değilken meta verilerde temsil edilemez ve bu nedenle bir öznitelik parametresi olmasını engeller.

+0

Teşekkürler, ondalık ilkel bir tür olduğunu düşündüm :-) – rjlopes

+2

Bu hala Framework 4.0 ile bir sorun mu? ve 4.5, 4.6.x? – midspace

+0

@midspace, gerçekten bir sorun değil, tasarımın dayattığı bir sınırlama. Bu talihsiz, ama asla gitmemesi için iyi şanslar. –

1

Niteliklerle gerçek zamanlı püf noktaları için TypeConverter sınıfını kullanıyorum.

2

Bu durumla karşılaştığımda, öznitelikteki özellikleri Double olarak göstermeyi bitirdim, ancak özniteliğin içinde Ondalık gibi davranıldı. Mükemmel olmaktan uzak ama basit vakalar için ihtiyacınız olan şey olabilir.

0

Aşağıdaki kurucuyu kullanabilirsiniz. C# kodunda ondalık edebi olduğunuzda, C# derleyicisi bu kurucuya bir çağrı gönderir.

Decimal(Int32, Int32, Int32, Boolean, Byte)

Düzenleme: Bunun uygun olmadığını biliyorum.

+1

Eğer bu özellik bir öznitelikte çalıştıysa, o zaman ben sadece "m" sonekini kullanacağımı tahmin ediyorum, ama ne de (Benim testim olarak System.ComponentModel.DefaultValueAttribute Kullanarak) – xr280xr

13

Aynı sorunu yaşıyorum. dizeleri kullanmayı düşünün. Bu tip güvenli değil, ancak okunabilir ve sanırım dizeleri :-) geçerli sayılar yazabileceğiz.

class BlahAttribute : Attribute 
{ 
    private decimal value; 

    BlahAttribute(string number) 
    { 
    value = decimal.Parse(number, CultureInfo.InvariantCulture); 
    } 
} 

[Blah("10.23")] 
class Foo {} 

Bu bir güzellik değil, tüm seçenekleri göz önünde bulundurarak yeterli.

+1

mbUnit'in http: // vkreynin'i nasıl ele aldığına benziyor. wordpress.com/2007/05/25/mbunit-24-rtm-now-you-can-use-decimals-in-row-attributes/ –

İlgili konular