2012-08-10 3 views
2

데이터베이스에서 데이터를 읽고 처리 한 다음 고정 폭 플랫 파일로 결과를 내보내는 앱을 만들고 있습니다.속성을 속성 내에 포함 할 수 있습니까?

나는 this 질문의 코드로 시작해서 그만 둔다.

이제 내보내기 된 파일에는 String, Num 및 Decimal (x, y)의 세 가지 주요 데이터 유형이 있습니다. 여기서 x는 소수점 왼쪽의 숫자이고 y는 오른쪽의 숫자입니다.

public class FixedWidthColumn : Attribute 
{ 
    public int Position { get; set; } 
    public int Length { get; set; } 

    public FixedWidthColumn(int position, int length) 
    { 
     Position = position; 
     Length = length; 
    } 
} 

이 가능 나는이 같은 특성을 작성하는 데 사용할 수있는 사용자 지정 특성 (또는 다른 구조)를 생성하기 :

[FixedWidthColumn(3,2, String)] 
public string CompanyId 

[FixedWidthColumn(6, 20, Num)] 
public int Sku { get; set; } 

[FixedWidthColumn(5, 10, Decimal(6,4)] 
public decimal Price { get; set; } 

나는 지금까지 내 사용자 지정 특성 등이있다

+0

'FixedWidthColumn'과 같이 보이는 것은 아직 두 개의 args를 취해서 예제에서 3을 전달하고 있습니다. – dtsg

+0

예. 의사 코드입니다. 그냥 최종 결과물을 –

+0

과 비슷하게 만들고 싶습니다. 멋지다/보행자입니다. – dtsg

답변

2

FixedWidthColumnAttribute를 확장하여 매개 변수 유형 속성을 전달할 수 있습니다.

 public enum FixedWidthColumnType 
     { 
      String, 
      Num, 
      Decimal 
     } 

     [AttributeUsage(AttributeTargets.Property)] 
     public class FixedWidthColumnAttribute : Attribute 
     {  
      public int Position { get; private set; }  
      public int Length { get; private set; }   
      public int Digits {get;set;} 
      public int FractionalDigits {get;set} 

      public FixedWidthColumnType Type {get; private set;} 
      public FixedWidthColumn(int position, int length, 
        FixedWidthColumnType type) 

      {   this.Position = position;   
         this.Length = length;  
         this.Type = type; 
      } 


     } 

사용 :

  [FixedWidthColumn(4, 10, FixedWidthColumnType.String)] 

     [FixedWidthColumn(5, 6, FixedWidthColumnType.Decimal, Digits = 3, FractionalDigits = 4)] 
0

나는 예를 들어, 상속을 사용하는 것이 좋습니다 것입니다 :

당신의 시험 코드에서
public class FixedWidthDecimalAttribute : FixedWidthColumnAttribute 
... 
public FixedWidthDecimal(int position, int wholeDigits, int fractionalDigits) 
... 
[FixedWidthDecimal(5, 6, 4)] 

, 당신은 GR 수 ab 모든 개체를 FixedWidthColumnAttribute 개체에 할당하고 상속을 허용 한 다음 유형을 확인 (GetType 사용)하여 정확히 어떤 개체인지 확인합니다.

2

먼저 FixedWithColumnAttribute 같은 클래스 이름 FixedWithColumn의 이름을 변경해야합니다. 아마도 규칙 일뿐입니다. 하지만 그 C#의 의미와 함께 적용하는 데 필요한 생각합니다. 그런 식으로 생성자를 선언

[FixedWidthColumn(3,2,typeof(String))] 

셋째 :

public FixedWidthColumnAttribute(int position, int length, Type objType) 

을 나는 당신이

+0

* 단지 규칙이며 C# 및 기타 .NET 언어는 다른 이름도 허용합니다 (C# 규칙은 분명히 모호함을 일으키지 않으면 이름 끝에 "속성"을 남기도록 허용되며, 이름 끝에 "속성"이없는 사람에게는 적용되지 않습니다). 그런 규칙을 따르는 것은 여전히 ​​좋은 생각입니다. –

+0

그래서이 예제에서는 십진수 형식에 포함 할 소수 자릿수를 어떻게 표현합니까? –

+0

NumberFormatInfo의 파생 인스턴스를 특성 클래스의 매개 변수로 전달하고 적절한 값으로 CurrencyDecimalDigits를 설정할 수 있습니다 – user1587368

1

에 대답하는 데 도움이 될 수 있습니다 희망 둘째, 호출 속성 선언에 대해서 typeof (유형)를 표시해야 특정 질문 : 아니오 당신은 속성 내에 속성을 가질 수 없습니다.

속성은 생성자에서 제한된 범위의 데이터 유형 만 사용할 수 있습니다. 예제는 MSDN documentation을 참조하십시오. 따라서 클래스를 속성으로 표시하는 속성을 가질 수 없습니다.

관련 문제