[英]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.