将不同但相关的对象分配给一个变量

时间:2013-12-04 15:11:29

标签: c# object

我是C#的新手,我的OOP知识很遗憾。这是我现在正在抨击的东西。

我正在使用一个外部类库,它使用同一类的3种不同风格。我希望能够将它们存储在通用名称中,因为它们具有共同的属性。我只是不确定如何做到这一点。

样品:

using ExternalStuff.Defining.GenericFieldCriterion;

foreach (Criteria c in criterion)
{

     if (c.type.ToLower() == "date")
     {
                    DateFieldCriterion thisCrit = new DateFieldCriterion();
                    thisCrit.Value = Convert.ToDateTime(c.operand);
     }
     else if (c.type.ToLower() == "string")
     {
                    StringFieldCriterion thisCrit = new StringFieldCriterion();
                    thisCrit.Value = c.operand;
     }
     else if (c.type.ToLower() == "numeric")
     {
                    NumericFieldCriterion thisCrit = new NumericFieldCriterion();
                    thisCrit.Value = Convert.ToDouble(c.operand);
     }
     else
     {
             // bleargh.
     }  
 //=================================================================================== 
 // Of course, here's the issue... I want to set a property of thisCrit... but it is
 // out of scope (see next line):
 //=================================================================================== 

     thisCrit.SomeProperty = "Hello!"; // <<< No workie
}

正如评论中所提到的,我想在thisCrit上设置属性,无论它是什么子类类型,在定义它的块之外。或者其他一些方法来做到这一点。这将会发生很多处理,我讨厌为每个子类重复它。

1 个答案:

答案 0 :(得分:3)

这样的东西?

public class Criterion<T>
{
  public T Value {get; set;}

  public string SomeProperty {get; set;}

}

修改

  

我希望能够将thisCrit设置为以下之一:DateFieldCriterion,   StringFieldCriterion或NumericFieldCriterion。但是,我不知道   如何做到这一点,并能够在范围之外使用thisCrit   阻止它被设置。

然后只需使用公共属性

创建一个公共接口
public interface ICriterion
{
   string SomeProperty {get; set;}
}

public class StringFieldCriterion : ICriterion
{
   public string SomeProperty {get; set;}
   public string Value {get; set;}
}

并像这样使用它:

ICriterion thisCrit = null;

if (c.type.ToLower() == "string")
{
    thisCrit = new StringFieldCriterion { Value = c.operand };
}
//other if/else blocks

thisCrit.SomeValue = "Hi";

编辑2

所以,所有三个标准都继承自QueryCriterion,对吗?这意味着您应该能够将具体的标准对象(如StringFieldCriterion)分配给QueryCriterion类型的变量。像这样:

QueryCriterion thisCrit = null;

if (c.type.ToLower() == "string")
{
    thisCrit = new StringFieldCriterion { Value = c.operand };
}
//other if/else blocks

thisCrit.SomeValue = "Hi";