0

这是我想做的事情:

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

乍一看,如果 T 是创建此类实例的泛型类型,这似乎很简单且可行。但是我想要做的是根据 Image 属性中所做的确定来提供字符串或位图,以便将作为 Image 服务的内容的知识包含在 Image 属性中,并且没有其他地方需要知道它。我当然可以使返回类型为“对象”,它会起作用,但我不希望装箱和拆箱效率低下,也不希望涉及反射。

在我放弃这个想法之前,我只是想和你们确认一下这是否可行。

4

5 回答 5

2

调用者使用公共财产“知道”不是更好吗

YourClass.IsWebContext

会发生什么?

然后你就可以使用泛型类型 T。

于 2009-11-30T18:28:48.337 回答
2

将值类型转换为引用类型时会发生装箱。

int i = 5;

object o = i; // Boxing

由于您只返回Stringor a Bitmap,它们都是引用类型,因此您可以使用 object 而不必担心装箱或拆箱。

于 2009-11-30T18:30:07.497 回答
1

似乎您应该考虑不同的设计,而不是解决这个问题。例如,为将要成为 WebContext 的所有内容创建一个单独的类并实现一个通用接口。

于 2009-11-30T18:30:34.650 回答
1

首先,将引用类型作为对象返回不是装箱。只有在使用值类型作为引用类型时才会发生装箱。

现在假设您正在使用 returntype 对象。然后您可以使用运算符验证返回的对象实例是否属于某种类型is

object o = myClass.ImageToShow;

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

其次,我不建议检查IsWebContext每处房产。创建一个基类并根据使用它的环境进行专门化会更有意义。

于 2009-11-30T18:31:08.987 回答
0

是的,使用接口。

   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());    
       }
   } 
于 2009-11-30T18:35:07.407 回答