質問

私は最近、.net の enum クラス (Rowlex OwlGrinder によって OWL クラスから作成されたもの) の定数間の循環に関する問題を提起しました。問題は .net リフレクションを使用することで解決されました (親愛なる Mr. の多大な助けのおかげです)。ジョン・スキート):スタックオーバーフロー:問題のサイクリング列挙型ク​​ラス値

これを解決して使い始めました。DropDownList で選択した値を enum クラス インスタンスの 1 つと一致させた後、述語 (=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
        }

ここで問題が発生します。Language[i] (または Language クラスの i 番目の定数を選択するためのこのようなもの) を使用して hasLanguage に割り当てることはできません。enumクラスのi番目の定数(リフレクションなど)を選択する方法はありますか?誰かこの状況で私を助けてくれませんか?

役に立ちましたか?

解決

Language クラスは、C# 用語の列挙型ではありません。これは public const 文字列フィールドを持つ通常のクラスです。ROWLEX は、次の 2 つの理由により、ネイティブ列挙型の代わりに列挙型模倣クラスを意図的に生成します。

  1. ネイティブC#列挙型の値は整数ですが、パブリックconst文字列フィールドはOWLクラス・インスタンスのURIを取得できます。
  2. クラスには、ROWLEX で生成されたすべての単一クラスのクラス URI を一貫して表す「URI」という追加のパブリック静的文字列を 1 つ持つことができます。

そういう背景があったんですね。あなたの質問を正しく理解していれば、ドロップダウンに表示される選択した名前を 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 列挙型模倣クラス (string=>Language) には暗黙的なキャスト演算子が実装されているため、トリプル サブジェクトを文字列として安全に設定できます。問題なくコンパイルされるはずです。シンプルですね。;)

他のヒント

私が言うと思います。

resLanFields[i].GetValue(null)

これが動作するかどうか、これはジョンのオリジナルの答えにあった、私を投票しない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top