문제

최근에 .net의 열거형 클래스(Rowlex OwlGrinder가 만든 OWL 클래스에서 생성됨)의 상수 간 순환에 관한 문제가 발생했습니다..net 리플렉션을 사용하여 문제가 해결되었습니다(친애하는 Mr.님의 큰 도움 덕분입니다).존 스키트):stackoverflow:문제-순환-열거-클래스-값

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

//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번째 상수를 선택하는 것과 유사한 것)를 사용할 수 없습니다.열거형 클래스의 i번째 상수(반사 등)를 선택하는 방법이 있나요?이 상황에서 나를 도와줄 사람이 있나요?

도움이 되었습니까?

해결책

Language 클래스는 C# 용어의 열거형이 아닙니다.공개 const 문자열 필드가 있는 일반 클래스입니다.ROWLEX는 다음 두 가지 이유로 네이티브 열거형 대신 의도적으로 열거형 모방 클래스를 생성합니다.

  1. 네이티브 C# 열거형의 값은 정수인 반면, 공개 const 문자열 필드는 OWL 클래스 인스턴스의 URI를 사용할 수 있습니다.
  2. 클래스에는 생성된 모든 단일 ROWLEX 클래스에 대해 일관되게 클래스 URI를 나타내는 "URI"인 하나의 추가 공개 정적 문자열이 있을 수 있습니다.

그것이 배경이었습니다.귀하의 질문을 올바르게 이해했다면 드롭다운에 표시된 선택한 이름을 URI에 다시 바인딩하는 데 문제가 있었고 생성한 배열 내부의 요소 위치를 사용하려는 것입니다.나는 그렇게 하지 않을 것이다.DropDownLists에는 일반적으로 모든 목록 항목에 대한 ID 및 값 필드가 모두 있습니다(구성 요소별로 이름이 다르게 지정될 수 있음).ID는 고유한 개체여야 하고 값에는 사람이 읽을 수 있는 내용이 포함되어야 합니다."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)에 암시적 형변환 연산자가 구현되어 있으므로 삼중 주제를 문자열로 안전하게 설정할 수 있습니다.문제없이 컴파일해야 합니다.간단하지 않나요?;)

다른 팁

말하고 싶습니다

resLanFields[i].GetValue(null)

그러나 이것이 효과가 있다면, 저에게 투표하지 마십시오. 이것은 Jon의 원래 대답에있었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top