정말 믿을 수 없지만 진짜입니다. 이 코드는 작동하지 않습니다 :
[AttributeUsage(AttributeTargets.Property|AttributeTargets.Field)]
public class Range : Attribute
{
public decimal Max { get; set; }
public decimal Min { get; set; }
}
public class Item
{
[Range(Min=0m,Max=1000m)] //compile error:'Min' is not a valid named attribute argument because it is not a valid attribute parameter type
public decimal Total { get; set; }
}
이것이 작동하는 동안 :
[AttributeUsage(AttributeTargets.Property|AttributeTargets.Field)]
public class Range : Attribute
{
public double Max { get; set; }
public double Min { get; set; }
}
public class Item
{
[Range(Min=0d,Max=1000d)]
public decimal Total { get; set; }
}
십진수가 아닌 동안 왜 double이 OK인지 누가 알 수 있습니까?
답변
이것은 CLR 제한입니다. 기본 상수 또는 기본 배열 만 속성 매개 변수로 사용할 수 있습니다. 그 이유는 속성이 메타 데이터로 완전히 인코딩되어야하기 때문입니다. 이것은 IL로 코딩 된 메소드 본문과 다릅니다. MetaData를 사용하면 사용할 수있는 값의 범위 만 심각하게 제한합니다. CLR의 현재 버전에서 메타 데이터 값은 프리미티브, 널 (null), 유형 및 프리미티브 배열로 제한됩니다 (사소한 것이 누락되었을 수 있음).
기본 유형 인 소수는 기본 유형이 아니므로 메타 데이터로 표현할 수 없으므로 속성 매개 변수가되지 않습니다.
답변
로부터 사양 :
속성 클래스의 위치 및 명명 된 매개 변수 유형은 다음과 같은 속성 매개 변수 유형으로 제한됩니다.
- 다음 유형 중 하나 :
bool
,byte
,char
,double
,float
,int
,long
,sbyte
,short
,string
,uint
,ulong
,ushort
.- 유형
object
입니다.- 유형
System.Type
입니다.- 열거 형은 공개 접근성 및 중첩 된 유형 (있는 경우)도 공개 접근성 (속성 사양)을 갖습니다.
- 위 유형의 1 차원 배열.
답변
이 문제에 대한 답은 원자 유형이 아니더라도 속성으로 허용되는 문자열을 사용하는 것입니다. 반올림으로 인해 결과의 정확도가 떨어 지므로 복식을 사용하지 마십시오.
public String MinimumValue
{
get
{
return minimumValueDecimal.ToString();
}
set
{
minimumValueDecimal = Decimal.Parse(value);
}
}
private decimal minimumValueDecimal;