C # - определить тип свойства во время выполнения - PullRequest
0 голосов
/ 30 ноября 2009

Вот что я хочу сделать:

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

На первый взгляд кажется простым и выполнимым, если T был универсальным типом, который был создан с экземпляром этого класса. Но я хочу предоставить строку или растровое изображение, основанное на определении, сделанном в свойстве Image, чтобы знание того, что для сервера использовать в качестве Image, содержалось в свойстве Image, и больше о нем не нужно знать. Я, конечно, могу сделать тип возвращаемого значения «объект», и он будет работать, но я не хочу, чтобы неэффективность упаковывания и распаковки тоже не требовала отражения.

Я просто хотел уточнить у вас, ребята, возможно ли это, прежде чем я откажусь от этой идеи.

Ответы [ 5 ]

2 голосов
/ 30 ноября 2009

Упаковка происходит при преобразовании типа значения в ссылочный тип.

int i = 5;

object o = i; // Boxing

Так как вы возвращаете только String или Bitmap, которые оба являются ссылочными типами, вы можете использовать объект, не беспокоясь о боксе или распаковке.

2 голосов
/ 30 ноября 2009

Не лучше ли звонящему "знать", используя публичное свойство

YourClass.IsWebContext

что ожидать?

Тогда вы сможете использовать универсальный тип T.

1 голос
/ 30 ноября 2009

Прежде всего, возвращение ссылочных типов как объекта не является боксом. Упаковка происходит только при использовании типа оценки в качестве ссылочного типа.

Теперь предположим, что вы используете объект returntype. Затем вы можете проверить, является ли возвращаемый экземпляр объекта определенного типа, используя оператор is.

object o = myClass.ImageToShow;

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

Во-вторых, я бы не рекомендовал проверять IsWebContext в каждом свойстве. Было бы разумнее создать базовый класс и специализироваться с учетом среды, в которой он используется.

1 голос
/ 30 ноября 2009

Похоже, вместо того, чтобы обойти это, вы должны рассмотреть другой дизайн. Например, создание отдельного класса для всего, что будет WebContext, и реализация общего интерфейса.

0 голосов
/ 30 ноября 2009

Да, используйте интерфейс.

   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());    
       }
   } 
...