سؤال

وهنا هو ما أريد القيام به:

public [type determined at runtime] ImageToShow
{
  get
  {
    if(this.IsWebContext)
    {
       return this.GetString();
    }
    else
    {
       return this.GetBitmap();
    } 
  }
}

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

وأردت فقط أن تحقق مع رفاق إذا كان ذلك ممكنا قبل أن تتخلى عن هذه الفكرة.

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

المحلول

يحدث

والملاكمة عند تحويل نوع قيمة إلى نوع مرجع.

int i = 5;

object o = i; // Boxing

ومنذ كنت ستعود String فقط أو Bitmap، والتي هي على حد سواء أنواع المراجع، يمكنك استخدام الكائن دون الحاجة إلى القلق حول الملاكمة أو علبته.

نصائح أخرى

وأليس من الأفضل للالمتصل إلى "معرفة"، وذلك باستخدام الممتلكات العامة

YourClass.IsWebContext

وماذا تتوقع؟

وثم هل سيكون قادرا على استخدام نوع T عام.

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

وقبل كل شيء، والعودة أنواع مرجع ككائن لا الملاكمة. يحدث الملاكمة فقط عند استخدام valuetype باعتباره referencetype.

والآن دعونا نقول كنت تستخدم الكائن returntype. ثم يمكنك التحقق إذا مثيل الكائن التي يتم إرجاعها هو من نوع معين باستخدام مشغل is.

object o = myClass.ImageToShow;

if (o is String)
{
  // Use as a String
}
else if (o is Bitmap)
{
  // Use as a Bitmap
}

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

نعم، استخدم واجهة.

   public interface IAmImage {}
   public class StringImage: IAmImage
   {
      private string img;
      public string Image { get { return img; } set { img = value; } }
      public StringImage(string image) { img = image;}
   }
   public class BitmapImage: IAmImage
   {
      private Bitmap img;
      public Bitmap Image { get { return img; } set { img = value; } }
      public BitmapImage(Bitmap image) { img = image;}
   }

... وفي رمز العميل الخاص بك ....

   public IAmImage ImageToShow 
   {  
       get  
       {    
           return this.IsWebContext?
              new StringImage(this.GetString()):        
              new BitmapImage(this.GetBitmap());    
       }
   } 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top