الوصول المسمى بشكل متطابقة أعضاء الفصل من حالات الطبقات المختلفة
سؤال
لدي مثيلات من الفئة 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();