[英]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
由於僅返回都是引用類型的String
或Bitmap
,因此可以使用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.