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

ボックス化は、値型を参照型に変換するときに発生します。

int i = 5;

object o = i; // Boxing

Stringどちらも参照型であるまたはのみを返すためBitmap、ボックス化またはボックス化解除を気にすることなくオブジェクトを使用できます。

于 2009-11-30T18:30:07.497 に答える
2

発信者が公共の財産を使って「知る」のは良いことではないでしょうか

YourClass.IsWebContext

何を期待します?

そうすれば、ジェネリック型Tを使用できるようになります。

于 2009-11-30T18:28:48.337 に答える
1

これを回避する代わりに、別の設計を検討する必要があるようです。たとえば、WebContextになるすべてのものに対して個別のクラスをまとめて作成し、共通のインターフェイスを実装します。

于 2009-11-30T18:30:34.650 に答える
1

まず第一に、オブジェクトとして参照型を返すことはボクシングではありません。ボクシングは、valuetypeを参照タイプとして使用する場合にのみ発生します。

ここで、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 に答える