[VB.NET] Decimal gebruiken als parameter in attribute class

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Ik ben bezig met een standaard voor het bedrijf waar ik werk.
Nu wil ik dat men als annotaties of attrubuut kan opgeven wat het bereik is van de ingevoerde waarde bij een propertie.
Bijvoorbeeld

<Annotaties.Tekst(255)> _
Property ...

Nu ben ik bezig met een decimale waarde waarbij opgegeven kan worden wat de minimale waarde en de maximale waarde is. We willen geen gebruik maken van double en single omdat deze vaak afwijken en we nemen voldoende met de 28 postities van een decimal.
Echter kan ik geen decimal gebruiken als parameter binnen een attribuut, ik heb gedacht aan:
- Long gebruiken echter kan deze maar tot 20 posities
- String maar dan heb je geen compiler check
- Double maar dit wijkt af

Heeft iemand een idee hoe ik deze 28 posities kan hanteren?

Code van gebruik zou zijn
<Annotaties.Decimaal(MinimaleWaarde, MaximaleWaarde, Decimalen)> _
Property ..

Thnx

Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Hoezo kun je geen decimal gebruiken als parameter binnen een attribuut? Is dit een functionele limitatie? Want technisch kan ik er geen bedenken. Of VB.Net moet ineens sterk afwijken van het normale Attribute model in .Net, wat me sterk lijkt.

edit: maar blijkbaar is het wel zo :P

[ Voor 42% gewijzigd door D-Raven op 11-06-2010 12:14 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 20-09 14:03
Waarom kan je geen decimal gebruiken als parameter binnen je ATtribute ?
Gaat het hier over .NET, of over Java, want je spreekt van attributes en van annotations ...

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
VB.NET laat geen Decimal toe in de constructor van een Attribute... Geen idee waarom, ik wist het ook niet maar het werkt toch echt niet:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Public Class Form1

    Private _Test As String
    <Range(255)> _
    Public Property Test() As String
        Get
            Return _Test
        End Get
        Set(ByVal value As String)
            _Test = value
        End Set
    End Property

End Class

Public Class RangeAttribute
    Inherits Attribute

    Private _Range As Decimal
    Public ReadOnly Property Range() As Decimal
        Get
            Return _Range
        End Get
    End Property

    Public Sub New(ByVal range As Decimal)
        _Range = range
    End Sub

End Class


Error:
Attribute constructor has a parameter of type 'Decimal', which is not an integral, floating-point or Enum type or one of Object, Char, String, Boolean, System.Type or 1-dimensional array of these types.
EDIT
In C# krijg ik deze error:
An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type
En googlen op 'attribute parameter type' levert deze link. Nog steeds geen uitleg waarom... :p

[ Voor 15% gewijzigd door NickThissen op 11-06-2010 11:57 ]

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
D-Raven schreef op vrijdag 11 juni 2010 @ 11:48:
Hoezo kun je geen decimal gebruiken als parameter binnen een attribuut? Is dit een functionele limitatie? Want technisch kan ik er geen bedenken. Of VB.Net moet ineens sterk afwijken van het normale Attribute model in .Net, wat me sterk lijkt.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 [AttributeUsage(AttributeTargets.Property)]
    public class TestAttribute : Attribute
    {
        public decimal Range;

        public TestAttribute(decimal range)
        {
            Range = range;
        }
    }

[..]

[TestAttribute(255)]
public string myProperty {get;set;}


Het is dan wel c# maar volgens mij is dit prima te porten naar vb.net
Bij het gebruik van waarde 79228162514264337593543950330 krijg ik integral constant to large.

Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
NickThissen schreef op vrijdag 11 juni 2010 @ 11:53:
VB.NET laat geen Decimal toe in de constructor van een Attribute... Geen idee waarom, ik wist het ook niet maar het werkt toch echt niet:

[...]
edit: blaat, minder aannames maken, meer testen :P

[ Voor 47% gewijzigd door D-Raven op 11-06-2010 12:17 ]


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Josvds schreef op vrijdag 11 juni 2010 @ 11:58:
[...]


Bij het gebruik van waarde 79228162514264337593543950330 krijg ik integral constant to large.
Klopt, Kan het zo even niet plaatsen aangezien de range van een decimal 79228162514264337593543950335 positive tot 79228162514264337593543950335 negative is..

Ik zou ook verwachten dat dit wel zou kunnen..

Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
9999999999999999999999999999m waarde kan standaard wel, maar als je dit als attribuut invult krijg je dat je een constante waarde moet hebben.

Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
D-Raven schreef op vrijdag 11 juni 2010 @ 12:00:
[...]


WTF gewoon.... wat een achterlijke restrictie zeg.

Ach ja een workaround kan zijn om je decimal waarde te wrappen in een object.

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
<Range(Range.Value(255))> _
    Public Property Test() As String
        ..

//in dan in je attribute klasse

 Public Function Value(ByVal range As Decimal) As ValueWrapperObjectOfZoiets
        //return value object welke je decimal waarde wrapt. 
    End Sub 
In C# werkt het dus ook niet he, dus het is een restrictie van het framework, niet van VB.

Je workaround werkt dus ook niet want je kan echt alleen de types die hier genoemd worden gebruiken.

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 20-09 14:03
Workaround: kan je 'm niet gewoon als property specifieren, en 'm dan als named property doorgeven ?
Ugly is het wel, want het dwingt niet af dat die range moet gespecifieerd zijn

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Is wrappen in een struct een oplossing?

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
NickThissen schreef op vrijdag 11 juni 2010 @ 12:11:
[...]


In C# werkt het dus ook niet he, dus het is een restrictie van het framework, niet van VB.

Je workaround werkt dus ook niet want je kan echt alleen de types die hier genoemd worden gebruiken.
Je hebt gelijk, ik zit uit mn nek te lullen.

edit:

Volgens deze gast is het een restrictie in de CLR vanwege de manier hoe er met Attributes om wordt gegaan.
bron
H!GHGuY schreef op vrijdag 11 juni 2010 @ 12:21:
Is wrappen in een struct een oplossing?
Nope, het is geen primitive type.
whoami schreef op vrijdag 11 juni 2010 @ 12:19:
Workaround: kan je 'm niet gewoon als property specifieren, en 'm dan als named property doorgeven ?
Ugly is het wel, want het dwingt niet af dat die range moet gespecifieerd zijn
Named parameters moeten aan dezelfde restricties voldoen.

@Josvds

Is het niet een optie om bijvoorbeeld een long al type te gebruiken en zelf de range af te vangen ?

[ Voor 54% gewijzigd door D-Raven op 11-06-2010 12:32 ]


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
whoami schreef op vrijdag 11 juni 2010 @ 12:19:
Workaround: kan je 'm niet gewoon als property specifieren, en 'm dan als named property doorgeven ?
Ugly is het wel, want het dwingt niet af dat die range moet gespecifieerd zijn
Nee, een decimal property wordt niet gezien. Enkel double maar dan kun je er niet de volledige preciese waarde in kwijt.

Daarnaast heb ik geprobeerd string mee te geven, echter bij compilen merkt je dan niets ook niet als je een getal vele maal te groot in vult. Krijg geen exception, niets..
Is het niet een optie om bijvoorbeeld een long al type te gebruiken en zelf de range af te vangen ?
Naja dat dacht ik ook echter kan een decimal tot 28 posities en een ulong maar tot maximaal 20 als ik het goed heb.

[ Voor 16% gewijzigd door Josvds op 11-06-2010 12:39 ]


Acties:
  • 0 Henk 'm!

  • Josvds
  • Registratie: November 2004
  • Laatst online: 26-08 20:42
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        ' Standaard constructor
        Public Sub New(ByVal iMinimaleWaarde As String, ByVal iMaximaleWaarde As String, ByVal iDecimalen As Byte)

            Console.WriteLine("waarde: " & iMinimaleWaarde)

            Throw New ArgumentException("waarde: " & iMaximaleWaarde)
            ' Waardes overnemen
            Me._minimaleWaarde = iMinimaleWaarde
            Me._maximaleWaarde = iMaximaleWaarde

            ' Decimalen overnemen
            Me._decimalen = iDecimalen

        End Sub


Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
    ' Totale aanschaf waarde
    <Annotaties.Decimaal("79228162514264337593543950330", "79228162514264337593543950330", 2)> _
    Public Property pTotaleAanschafWaarde() As Decimal
        Get
            Return Me._totaleAanschafWaarde
        End Get
        Set(ByVal iValue As Decimal)
            Me._totaleAanschafWaarde = iValue
        End Set
    End Property


In mijn ogen zou deze aanroep een exception of iig een console write moeten genereren. Wanneer is me onduidelijk dus bij het aanmaken van dit object, en het instellen van een waarde komt er nog steeds geen exception :S.

[Edit] Dit wordt pas uitgevoerd wanneer je de argumenten zelf opvraagt.

[ Voor 3% gewijzigd door Josvds op 11-06-2010 13:46 ]

Pagina: 1