2009-06-04 9 views
0

.net에서 enum 클래스의 상수 사이의 순환에 관한 문제가 최근에 제기되었습니다 (Rowlex OwlGrinder가 작성한 OWL 클래스에서 생성 됨). 문제 (친애하는 미스터 존 소총에서 큰 도움에 감사) .NET 반사를 사용에 의해 해결되었다 :이 문제를 해결함으로써 stackoverflow:problem-cycling-enum-class-valuesenum 클래스의 상수 선택 문제

, 나는 그것을 사용하기 시작했다. dropDownList 선택된 값을 enum 클래스 인스턴스 중 하나와 일치시킨 후에는 선택한 객체 (= Language)를 내 RDF 제목 (= learningResource), 선언문 (= hasLanguage)을 통해 선언해야했습니다.

//learningResource is a new RDF subject, hasLanguage is predicate, and there 
     //is a new value for it - Language. 

     System.Reflection.FieldInfo[] resLanFields = 
      typeof(Language).GetFields(); 

     for (int i = 0; i < resLangFields.Length; i++) 
     { 
      if (resLanFields[i].Name.Equals(dropDownList_lang.SelectedValue)) 
       learningResource.hasLanguage = ??? //i-th constant of Language 
     } 

이제 문제가 발생합니다. hasLanguage에 대입하기 위해 Language [i] (또는 이와 비슷한 것을 Language 클래스의 i 번째 상수를 선택하는 데 사용할 수 없습니다. enum 클래스의 i 번째 상수를 선택하는 방법이 있습니까 (예 : refelections)? 이 상황에서 도와 주시겠습니까?

+0

원래 질문을 이해하고있는 경우 열거 형이 아닙니다. – Jimmy

+0

아마도 열거 형 클래스가 아닙니다! 하지만 난 어딘가에 그것을봤을 때 거의 확실 해요. – Ehsan

답변

1

언어 클래스는 C# 용어로 열거 형이 아닙니다. public const string 필드가있는 일반 클래스입니다. ROWLEX 의도적으로 2 개 이유로 열거 - 모방 - 클래스 대신 기본 열거를 생성 : 공공 CONST 문자열 필드는 OWL 클래스 인스턴스의 URI를 취할 수있는 반면

  1. 네이티브 C#을 열거의 값이 정수입니다.
  2. 이 클래스에는 모든 단일 ROWLEX 생성 클래스에 대해 일관되게 클래스 URI를 나타내는 "URI"인 하나의 추가 공용 정적 문자열이있을 수 있습니다.

그 배경이되었습니다. 질문을 올바르게 이해했다면 드롭 다운에 표시된 선택된 이름을 URI에 바인딩하는 문제가 발생했으며 작성한 배열 내부에서 요소의 위치를 ​​사용하려고했습니다. 나는 그렇게하지 않을 것이다. DropDownLists는 일반적으로 모든 목록 항목에 대해 ID와 값 필드를 모두 갖습니다 (구성 요소와 구성 요소가 다르게 명명 될 수 있음). Value는 독창적 인 객체가 될 것으로 예상되지만 Value는 사람이 읽을 수있는 무언가를 포함 할 것으로 예상됩니다. "enum"필드의 URI와 ID 값을 설정하십시오. 그래서 당신이 당신의 드롭 다운 채우는 방법은 다음과 같습니다

System.Reflection.FieldInfo[] resLanFields = typeof(Language).GetFields(); 
foreach(FieldInfo field in resLanFields) 
{ 
    ListItem item = new ListItem(); 
    item.ID = field.GetValue(null); // takes the URI value of the const field 
    item.Value = field.Name; // takes the name of the const field 
    dropDownList_lang.AddItem(item); 
} 

을 그리고 사용자가 그/그녀의 선택을 할 때 결과를 읽는 방법이 있습니다 :

learningResource.hasLanguage = (string) dropDownList_lang.SelectedItem.ID; 

가 암시 적 캐스팅 연산자에 구현 때문에 ROWLEX enum-imitating-class (string => Language)를 사용하면 트리플 피사체를 문자열로 안전하게 설정할 수 있습니다. 문제없이 컴파일해야합니다. 간단하지? ))

+0

간단하고 도움이됩니다. 고맙습니다 – Ehsan

0

나는

resLanFields[i].GetValue(null) 

을 말하고 싶지만하지만이 작동하는 경우,이 존의 원래 대답했다, 날 투표를하지 않습니다.

+0

답변 해 주셔서 감사합니다. "learningResource.hasLanguage"는 "learningResource.hasLanguage"가 할당 한 "언어"유형을 받아들이 기 때문에 작동하지 않습니다. – Ehsan