我是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上设置属性,无论它是什么子类类型,在定义它的块之外。或者其他一些方法来做到这一点。这将会发生很多处理,我讨厌为每个子类重复它。
答案 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";