الوصول المسمى بشكل متطابقة أعضاء الفصل من حالات الطبقات المختلفة

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

  •  12-09-2019
  •  | 
  •  

سؤال

لدي مثيلات من الفئة A و B، وكلا الفصولتين تنفذ عضوا "نص". هل هناك طريقة للوصول إلى نص عضو بطريقة عامة؟ آمل أن يكون هناك شيء مماثل على طريقة JavaScript في مجرد قول:

instance['Text'] = value;

ملاحظة: هذه الطبقتين للأسف لا تنفذ كل الواجهة نفسها مع عضو نصي.

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

المحلول

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

instance.GetType().GetProperty("Text").SetValue(instance, "new value", null);

نصائح أخرى

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

typeof(A).GetProperty("Text").GetValue(theInstance, null);

أين theInstance سيكون مثالا للفئة.

من الناحية المثالية، يجب أن يكون لديك فئة واحدة مع عضو "نص"، والتي ستكون قاعدة ل A و B. ربما ليس مناسبا، لكنها أكثر موثوقية وصحيحة. حاول عدم استخدام الانعكاس حيث يمكنك أن تفعل الشيء نفسه بطريقة أخرى.

إذا كنت تستطيع إنشاء و B تنفيذ نفس الواجهة

 interface ISomeGenericNameForAAndB
{
    string Text { get; }
}
class A :ISomeGenericNameForAAndB
{
    public string Text { get { return "some Text from A"; } }    
}
class B : ISomeGenericNameForAAndB
{
    public string Text { get { return "some Text from B"; } }
}

ISomeGenericNameForAAndB anAInstance = new A();
ISomeGenericNameForAAndB aBInstance = new B();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top