هل يمكنني تغيير حقل خاص موروث للقراءة فقط في C# باستخدام الانعكاس؟

StackOverflow https://stackoverflow.com/questions/1401458

سؤال

كما هو الحال في جافا لدي:

Class.getSuperClass().getDeclaredFields()

كيف يمكنني معرفة المجال الخاص وتعيينه من فئة فائقة؟

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

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

المحلول

نعم، من الممكن استخدام الانعكاس لتعيين قيمة حقل للقراءة فقط بعد تشغيل المُنشئ

var fi = this.GetType()
             .BaseType
             .GetField("_someField", BindingFlags.Instance | BindingFlags.NonPublic);

fi.SetValue(this, 1);

يحرر

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

نصائح أخرى

نعم، يمكنك.

وبالنسبة للحقول، استخدام فئة FieldInfo. المعلمة BindingFlags.NonPublic يسمح لك أن ترى المجالات خاصة.

public class Base
{
    private string _id = "hi";

    public string Id { get { return _id; } }
}

public class Derived : Base
{
    public void changeParentVariable()
    {
        FieldInfo fld = typeof(Base).GetField("_id", BindingFlags.Instance | BindingFlags.NonPublic);
        fld.SetValue(this, "sup");
    }
}

وواختبار صغير لاثبات ذلك يعمل:

public static void Run()
{
    var derived = new Derived();
    Console.WriteLine(derived.Id); // prints "hi"
    derived.changeParentVariable();
    Console.WriteLine(derived.Id); // prints "sup"
}

وهذه الفئة سوف تتيح لك القيام بذلك:

<لأ href = "HTTP: // csharptest. صافي / استعراض / SRC / المكتبة / التأمل / PropertyType.cs "يختلط =" نوفولو noreferrer "> http://csharptest.net/browse/src/Library/Reflection/PropertyType.cs

والاستعمال:

new PropertyType(this.GetType(), "_myParentField").SetValue(this, newValue);

وراجع للشغل، وسوف يعمل على حقول العامة / غير العامة أو الممتلكات. لسهولة الاستخدام يمكنك استخدام فئة PropertyValue مثل هذا:

new PropertyValue<int>(this,  "_myParentField").Value = newValue;

ومثل يقترح JaredPar، فعلت التالي:

//to discover the object type
Type groupType = _group.GetType();
//to discover the parent object type
Type bType = groupType.BaseType;
//now I get all field to make sure that I can retrieve the field.
FieldInfo[] idFromBaseType = bType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

//And finally I set the values. (for me, the ID is the first element)
idFromBaseType[0].SetValue(_group, 1);

وشكرا للجميع.

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