الوصول إلى الأعضاء غير العامة لكائن عام

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

  •  09-06-2019
  •  | 
  •  

سؤال

هل هناك طريقة لجمع (على سبيل المثال؟في القائمة) كائنات "عامة" متعددة لا تشترك في فئة فائقة مشتركة؟إذا كان الأمر كذلك، كيف يمكنني الوصول إلى ممتلكاتهم المشتركة؟

على سبيل المثال:

class MyObject<T>
{
   public T Value { get; set; }
   public string Name { get; set; }

   public MyObject(string name, T value)
   {
      Name = name;
      Value = value;
   }
}

var fst = new MyObject<int>("fst", 42);
var snd = new MyObject<bool>("snd", true);

List<MyObject<?>> list = new List<MyObject<?>>(){fst, snd};

foreach (MyObject<?> o in list)
   Console.WriteLine(o.Name);

من الواضح أن هذا رمز زائف، وهو لا يعمل.

كما أنني لست بحاجة إلى الوصول إلى خاصية .Value (نظرًا لأن ذلك لن يكون آمنًا للنوع).

يحرر: الآن بعد أن كنت أفكر في هذا، سيكون من الممكن استخدام الفئات الفرعية لهذا الغرض.ومع ذلك، أعتقد أن هذا يعني أنني يجب أن أكتب فئة فرعية جديدة لكل نوع جديد.


@جريزينيونعم، هذا أجاب بالضبط على سؤالي.بالطبع، أحتاج الآن إلى تكرار الواجهة المشتركة بأكملها، لكن هذه ليست مشكلة كبيرة.كان يجب أن أفكر في ذلك...

@akuأنت على حق فيما يتعلق بكتابة البطة.لا أتوقع إمكانية الوصول إلى نوعين عشوائيين تمامًا من الكائنات.

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

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

المحلول

لا أعتقد أن هذا ممكن في C#، لأن MyObject ليس فئة أساسية من MyObject.ما أفعله عادةً هو تحديد واجهة (واجهة "عادية" وليست عامة) وجعل MyObject ينفذ تلك الواجهة، على سبيل المثال.

interface INamedObject
{
    string Name {get;}
}

وبعد ذلك يمكنك استخدام الواجهة:

List<INamedObject> list = new List<INamedObject>(){fst, snd};

foreach (INamedObject o in list)
   Console.WriteLine(o.Name);

هل أجاب على سؤالك؟

نصائح أخرى

لا يدعم C# كتابة البطة.لديك خياران:الواجهات والميراث، وإلا فلن تتمكن من الوصول إلى خصائص مماثلة لأنواع مختلفة من الكائنات.

أفضل طريقة هي إضافة فئة أساسية مشتركة، وإلا يمكنك الرجوع إلى التفكير.

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