C#-在运行时确定属性类型

C#-在运行时确定属性类型,c#,runtime,anonymous,C#,Runtime,Anonymous,以下是我想做的: public [type determined at runtime] ImageToShow { get { if(this.IsWebContext) { return this.GetString(); } else { return this.GetBitmap(); } } } 乍一看,如果T是创建此类实例的泛型类型,那么它看起来简单可行。但是我想做的是根据Image属性中的确

以下是我想做的:

public [type determined at runtime] ImageToShow
{
  get
  {
    if(this.IsWebContext)
    {
       return this.GetString();
    }
    else
    {
       return this.GetBitmap();
    } 
  }
}
乍一看,如果T是创建此类实例的泛型类型,那么它看起来简单可行。但是我想做的是根据Image属性中的确定来提供字符串或位图,这样,关于作为Image服务的内容的知识就包含在Image属性中,其他任何地方都不需要知道。我当然可以将返回类型设为“object”,它会工作,但我不希望装箱和拆箱效率低下,也不希望涉及反射


在我放弃这个想法之前,我只是想和你们确认一下这是否可行

调用方使用公共属性“知道”不是更好吗

YourClass.IsWebContext
期待什么


那么您就可以使用泛型类型T了。

调用方使用公共属性“知道”不是更好吗

YourClass.IsWebContext
期待什么


然后您就可以使用泛型类型T。

当您将值类型转换为引用类型时,会发生装箱

int i = 5;

object o = i; // Boxing

由于只返回
字符串
位图
,这两种类型都是引用类型,因此可以使用object,而不必担心装箱或取消装箱。

将值类型转换为引用类型时会发生装箱

int i = 5;

object o = i; // Boxing

因为您只返回代码>字符串或<代码>位图< /代码>,这两种类型都是引用类型,所以您可以使用对象而不必担心装箱或拆箱。

似乎不是围绕这一点工作,而是应该考虑不同的设计。例如,为WebContext和实现一个公共接口的所有东西创建一个单独的类。

似乎不是围绕这一点工作,而是应该考虑不同的设计。例如,为将成为WebContext的所有内容一起创建一个单独的类,并实现一个公共接口。

首先,将引用类型作为对象返回不是简单的。装箱仅在将valuetype用作referencetype时发生

现在假设您正在使用returntype对象。然后,您可以使用
is
操作符验证返回的对象实例是否属于特定类型

object o = myClass.ImageToShow;

if (o is String)
{
  // Use as a String
}
else if (o is Bitmap)
{
  // Use as a Bitmap
}

其次,我不建议在每个属性中都检查
IsWebContext
。创建一个基类,并根据它所处的环境进行专门化,这会更有意义。

首先,将引用类型作为对象返回并不是简单的。装箱仅在将valuetype用作referencetype时发生

现在假设您正在使用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());    
       }
   } 

是的,使用一个接口

   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());    
       }
   } 

在这里使用object,就不会有任何拳击动作。当您需要使用object将值类型视为对象引用(即调用整数上的方法)时,就会发生装箱。在这里,您不会进行装箱。当需要将值类型视为对象引用(即对整数调用方法)时,会发生装箱我同意…我将分别公开这两个属性并让调用方决定做什么。我同意…我将分别公开这两个属性并让调用方决定做什么。使用此对象比
对象
有什么好处?它的类型更强。。。只有StringImage或BitmapImage类型的对象才能实现此接口,因此此方法只能返回那些具体类型…我明白你的意思,但我建议不要使用这两种技术:-)它基本上会将类型检查推迟到实例的使用位置,并鼓励糟糕的应用程序设计。由于IAMMImage接口不包含任何属性,因此使ImageToShow类型的属性IAMMImage没有真正的帮助。我仍然必须在调用代码中将ImageToShow强制转换为StringImage或BitmapImage。因此,在这种情况下,我最好返回一个对象,并在调用代码中将其转换为字符串或位图。本例中的强类型没有提供太多值IMHO。@Yannick,没有,类型检查是在编译时完成的。因为它的stromgly-typed强制代码本身不试图构造和返回除两个派生类型之外的任何类型。并且,使用返回值的任何内容都可以被键入以接受此接口的实例,从而保证必须为该方法提供这两种类型之一的对象。使用此对象比使用
对象
有什么好处?它的类型更强。。。只有StringImage或BitmapImage类型的对象才能实现此接口,因此此方法只能返回那些具体类型…我明白你的意思,但我建议不要使用这两种技术:-)它基本上会将类型检查推迟到实例的使用位置,并鼓励糟糕的应用程序设计。由于IAMMImage接口不包含任何属性,因此使ImageToShow类型的属性IAMMImage没有真正的帮助。我仍然必须在调用代码中将ImageToShow强制转换为StringImage或BitmapImage。因此,在这种情况下,我最好返回一个对象,并在调用代码中将其转换为字符串或位图。本例中的强类型没有提供太多值IMHO。@Yannick,没有,类型检查是在编译时完成的。因为它的stromgly-typed强制代码本身不试图构造和返回除两个派生类型之外的任何类型。返回值用于的任何内容都可以被类型化以接受该接口的实例,从而保证该方法必须被提供为这两种类型之一的对象。