繁体   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