簡體   English   中英

C#-在運行時確定屬性類型

[英]C# - Determine property type at runtime

這是我想做的:

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

乍看之下,如果T是使用此類實例創建的泛型類型,則似乎很簡單且可行。 但是我要做的是根據Image屬性中的確定結果提供字符串或位圖,這樣就可以將Image作為Image服務器的知識包含在Image屬性中,而其他任何地方都不需要知道。 我當然可以將返回類型設置為“對象”,並且可以正常工作,但是我不希望裝箱和拆箱效率低下,也不需要反射。

我只是想與你們一起檢查是否有可能,然后再放棄這個想法。

使用公共財產讓呼叫者“知道”會更好嗎?

YourClass.IsWebContext

會發生什么?

然后,您將可以使用通用類型T。

當您將值類型轉換為引用類型時,將發生裝箱。

int i = 5;

object o = i; // Boxing

由於僅返回都是引用類型的StringBitmap ,因此可以使用object,而不必擔心裝箱或拆箱。

似乎您應該考慮采用其他設計,而不是解決此問題。 例如,為將要成為WebContext的所有內容創建一個單獨的類,並實現一個公共接口。

首先,將引用類型作為對象返回不會裝箱。 僅在將值類型用作引用類型時才進行裝箱。

現在,假設您正在使用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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM