2013-10-21 5 views
11

데이터 필드를 나타내는 객체가 있다고 가정 해 봅시다.이 객체에는 이름, 유형, 값, 길이라는 속성이 필요합니다. 여기에 객체가 있습니다 :일반 객체의 일반 목록

class Field<T> 
{ 
    public string Name { get; set; } 
    public Type Type 
    { 
     get 
     { 
      return typeof(T); 
     } 
    } 
    public int Length { get; set; } 
    public T Value { get; set; } 
} 

제네릭을 사용했습니다. 특정 유형의 값만 코드의 사용자에게 할당 할 수 있기를 원합니다.
이제는 필드 목록을 만들 때 문제가 있습니다.
List<Field<object>>과 같은 목록을 만들면 목록의 특정 필드에 값을 할당 할 수 있으며 유형을 쿼리 할 때 '개체'가 표시됩니다.
그 목록에 문자열이 들어있는 필드가 거의없고, 정수, 날짜 및 심지어 사용자 지정 개체가 들어있는 필드를 원할 수도 있습니다.
Generics는 다음과 같은 좋은 솔루션입니까? 그? 그렇다면 어떻게 구현할 것인가? 그렇지 않은 경우 더 좋은 방법은 무엇입니까?

은 --- 편집 ---
그냥 좀 더 배경 추가 :
가 1. 내가 필드의 목록을 할 수 있습니다, 그리고 각 필드는과 같이, 서로 다른 데이터 유형을 개최한다 :

List<Field<object>> lst = new List<Field<object>>(); 
lst.Add(new Field<string>()); 
lst.Add(new Field<int>()); 
lst.Add(new Field<SomeObjectFromMyApp>()); 

2. 나중에 나는이 오브젝트를 조회해야합니다, 그리고보기 자동 해당 속성 루프에서, 그런 일 :

foreach(Field<object> fld in lst) 
{ 
    Type t = fld.Type; 
    //do some other stuff 
} 
+0

정확히 무엇을 원하십니까? 나는이 문장을 이해하지 못한다. "그 목록에는 문자열이 들어있는 필드가 거의없고, 정수, 날짜, 심지어는 사용자 지정 개체까지 포함 할 수도 있습니다. 필드의 목록이 있습니다. – Florian

+0

정확히 말하면, 서로 다른 필드 목록이지만 해당 목록의 각 필드에는 다른 데이터 유형 (int, string 또는 사용자 정의 객체)이있을 수 있습니다. –

답변

9

예, 제네릭은 좋은 선택이 될 것입니다. 유형의 안전을 달성 (그리고 Type 속성 유형을 식별되는 열쇠는 목록과 Field<T> 클래스 사이에 추상화를 추가하는 것입니다.

가지고 Field<T> 인터페이스 IField를 구현합니다. 어떤 구성원이 필요하지 않습니다이 인터페이스.

그럼. List<IField> 인 것으로

만 필드를 포함하도록 목록을 제한 그런 식 목록을 선언하지만, 각 필드는 다른 유형이 될 수 있습니다.

하는 것은 그 값이 나중에 바로 할 읽으려면

foreach(var field in list) 
{ 
    var type = field.Type; 
    .... 
} 
+0

그 목록을 만드는 문제를 해결할 수 있지만 적절한 필드 <_type_> 캐스팅해야 할 것이므로 이후 값을 읽는 문제를 해결할 수 및 \ _type \ _ 알고있는 방법은 없습니다. 그 시간 ... –

+0

@DanielGruszczyk 왜 캐스팅해야합니까?이 두 가지 중 잘 작동합니다 : var field = list [index] 또는 IField field = list [index] –

+0

클래스에서 특정 메서드를 적용 할 수 있기 때문에 인터페이스가 실제로 훨씬 잘 어울리는 것처럼 체크 아웃 할 것입니다. –

10

난 당신이 인터페이스를 정의하는 것이 좋습니다 및 필드 인터페이스

public interface IField 
    { 

    } 

public class Field<T> : IField 
    { 
     public string Name { get; set; } 
     public Type Type 
     { 
      get 
      { 
       return typeof(T); 
      } 
     } 
     public int Length { get; set; } 
     public T Value { get; set; } 
    } 

그래서이 코드를 쓸 수 있도록 구현 :

var list = new List<IField>(); 

지금이 목록 유형 Field<T>의 객체를 포함 할 수 있습니다

+1

기존 답변을 반복하면 어떤 이점이 있습니까? –

+7

그들 사이에 단 4 분이있었습니다. 네가 나처럼 느린 타이퍼라면 다른 대답을 눈치 채지 못할 수도있다. –

+1

예 다른 답변을 알지 못했습니다. – VahiD