سؤال

قد يكون طرح هذا غير صحيح ، ولكن يمكن/كيف يمكنك العثور على حقول في فئة في حد ذاته...على سبيل المثال...

public class HtmlPart {
  public void Render() {
    //this.GetType().GetCustomAttributes(typeof(OptionalAttribute), false);
  }
}

public class HtmlForm {
  private HtmlPart _FirstPart = new HtmlPart();      
  [Optional] //<-- how do I find that?
  private HtmlPart _SecondPart = new HtmlPart();
}

أو ربما أنا فقط أفعل هذا غير صحيح...كيف يمكنني استدعاء الأسلوب ومن ثم تحقق من سمات تطبيقها على نفسه ؟

أيضا من أجل السؤال - أنا الغريب إذا كان من الممكن العثور على معلومات السمة دون معرفة/الوصول إلى الطبقة الأم!

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

المحلول

إذا فهمت سؤالك بشكل صحيح ، أعتقد أن ما كنت تحاول القيام به هو غير ممكن...

في Render طريقة, كنت ترغب في الحصول على إمكانية سمة تطبيقها على الكائن.السمة ينتمي إلى الميدان _SecondPart الساحرة ينتمي إلى فئة HtmlForm.

أن العمل سيكون لديك لتمرير استدعاء كائن إلى Render الطريقة:

    public class HtmlPart {
        public void Render(object obj) {
            FieldInfo[] infos = obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

            foreach (var fi in infos)
            {
                if (fi.GetValue(obj) == this && fi.IsDefined(typeof(OptionalAttribute), true))
                    Console.WriteLine("Optional is Defined");
            }
        }
    }

نصائح أخرى

هنا مثال من كائن واحد كيفية العثور على إذا كان أي عامة أو خاصة المجالات على أن الكائن خاصية معينة:

var type = typeof(MyObject);
foreach (var field in type.GetFields(BindingFlags.Public |
             BindingFlags.NonPublic | BindingFlags.Instance))
{
    if (field.IsDefined(typeof(ObsoleteAttribute), true))
    {
        Console.WriteLine(field.Name);
    }

}

بالنسبة للجزء الثاني من سؤالك يمكنك التحقق من إذا كان سمة defiend على الطريقة الحالية باستخدام:

MethodInfo.GetCurrentMethod().IsDefined(typeof(ObsoleteAttribute));

تحرير

للرد على تحرير نعم هو ممكن دون معرفة نوع الفعلي.الدالة التالية يأخذ نوع المعلمة وإرجاع جميع الميادين التي لها بالنظر إلى السمة.شخص ما في مكان ما سوف إما معرفة نوع تريد البحث ، أو لن يكون له مثيل من نوع تريد البحث.

دون أن عليك أن تفعل كما جون السكيت قال وهو يعدد على جميع الكائنات في الجمعية.

   public List<FieldInfo> FindFields(Type type, Type attribute)
    {
        var fields = new List<FieldInfo>();
        foreach (var field in type.GetFields(BindingFlags.Public |
                           BindingFlags.NonPublic |
                           BindingFlags.Instance))
        {
            if (field.IsDefined(attribute, true))
            {
                fields.Add(field);
            }

        }
        return fields;
    }

يمكنك أن تجد الحقول ضمن فئة باستخدام Type.GetFields, و يمكنك أن تجد سمات تطبيق الحقل باستخدام MemberInfo.GetCustomAttributes أو IsDefined - ولكن إذا كنت في حاجة للعثور على جميع الحقول من نوع معين ، عليك أن:

  • تكرار عبر كل الجمعيات التي تريد البحث
  • تكرار عبر كل أنواع داخل كل جمعية
  • تكرار عبر كل المجالات داخل كل نوع
  • التحقق من السمة وجود/غياب لكل حقل

الآن, إذا كنت حقا محاولة لمعرفة "هو سمة معينة تطبق على حقل القيمة التي هي إشارة إلى هذا الكائن" ثم هذا هو أصعب - لأن عليك أن تعرف كل شيء عن كل كائن في النظام.يجب أيضا أن نضع في اعتبارنا أن يمكن أن يكون هناك اثنين المجالات سواء مع نفس القيمة ، أيالرجوع إلى نفس الكائن.أن الكائن اعتباره "اختياري" في هذه الحالة أم لا ؟

في الأساس, إذا كان الكائن يجب أن يكون العقار (مثلا ، اختياري أو لا) ثم أنه يجب أن يكون العقار الكائن نفسه لا يحتوي مكان الإقامة.

يمكن أن يكون ذلك أنا أسأت فهم ما تحاولين القيام به, ولكن أنا المشتبه به إما غير ممكن أو على الأقل ليس فكرة جيدة.هل يمكن أن تشرح الصورة الأكبر هنا ؟ ما كنت حقا محاولة تحقيق مع هذه الخاصية ؟

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