سؤال

لقد شجعت على مشكلة في الآونة الأخيرة حول ركوب الدراجات بين الثوابت من فئة العادة في .NET (التي يتم إنشاؤها من فئة البومة، عن طريق Owlex owlgrinder). تم حل المشكلة عن طريق استخدام .NET انعكاس (بفضل مساعدة كبيرة من عزيزي السيد جون سكيت):Stackoverflow: مشكلة في حل المشكلات

عن طريق حل هذا، بدأت في استخدامه. بعد مطابقة القيمة المنسدلة القيمة المحددة إلى إحدى مثيلات Enum Class، اضطررت إلى إعلان الكائن المحدد (= اللغة) إلى موضوع RDF الخاص بي (= التعلم Resource)، عبر المسند (= 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
        }

الآن تظهر المشكلة؛ لا أستطيع استخدام اللغة [i] (أو شيء من هذا القبيل لتحديد I-th ثابت من فئة اللغة) لتعيين haslanguage. هل هناك طريقة لتحديد I-th ثابت من فئة Enum (مثل التدفقات)؟ هل سيساعدني أي شخص في هذا الموقف؟

هل كانت مفيدة؟

المحلول

فئة اللغة ليست عداد في مصطلحات C #. إنها فئة عادية مع حقول سلسلة CONTER العامة. يولد Rowlex عمدا فصول المعينين بدلا من العادة الأصلية لسببين:

  1. قيمة Native C # Enum هي عدد صحيح، في حين أن حقل سلسلة CONTER CONTER يمكن أن يأخذ URI مثيل الطبقة البومة.
  2. يمكن للفئة أن تحتوي على سلسلة ثابتة واحدة ثابتة "URI" والتي تمثل الطبقة URI على الفور مقابل كل فئة OWLLEX واحدة.

كانت هذه هي الخلفية. إذا فهمت سؤالك الصحيح، فقد كان لديك مشكلة ملزمة الاسم المحدد المعروض في القائمة المنسدلة مرة أخرى إلى URI، وأنت تريد استخدام موضع العنصر داخل الصفيف الذي قمت بإنشائه. لن أفعل ذلك بهذه الطريقة. عادة ما يكون لدى القائمة السفلية حقول الهوية والقيمة لكل عنصر قائمة (يمكن تسمية مكون مختلف للمكون). من المتوقع أن يكون المعرف كائنا فريدا بينما من المتوقع أن تحتوي القيمة على شيء مقروء بشري. قم بتعيين المعرف باستخدام حقل "Enum"، والقيمة التي قمت بها. لذلك هذا هو كيفية ملء القائمة المنسدلة الخاصة بك:

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-CLISTING-CLAST (String => Language)، فيمكنك ضبط موضوعك الثلاثي بأمان كسلسلة. يجب أن تجميع دون إصدار. بسيط، أليس كذلك؟ ؛)

نصائح أخرى

أريد أن أقول

resLanFields[i].GetValue(null)

ولكن إذا كان هذا يعمل، فلا تصوتني، وكان هذا في إجابة جون الأصلية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top