如何为派生类对象编写验证方法

时间:2015-09-15 14:53:50

标签: c# inheritance

我正在从具有一些常见和几个不同属性的不同类型的CSV文件中读取用户输入。我已经创建了一个基类TestCaseData和派生类,如下所示:

public abstract class TestCaseData
{
 public abstract string ID { get; set; }
 public abstract string Name{ get; set; }
}

public class DerivedClassOne :TestCaseData
{
public override string ID { get; set; }
public override string Name{ get; set; }

pubic string DerivedOneProperty{ get; set; }
}

public class DerivedClassTwo :TestCaseData
{
public override string ID { get; set; }
public override string Name{ get; set; }

pubic string DerivedTwoProperty{ get; set; }
}

我正在阅读CSV文件并创建派生类列表并分配到基类列表,如下所示

List<TestCaseData> lstTestCaseData = MethodCallToReturnListOf_DerivedOneClassFromCSV();

现在我有lstTestCaseData我还必须验证用户输入,我无法找到一种方法来编写单个方法来验证类型DerivedOnePropertyDerivedTwoProperty的用户输入因为他们有自己的属性。有人可以帮我吗?

我有类似的方法签名

 public string ValidateCompleteFile(List<TestCaseData> TestCaseInputList, out bool IsInputValid)

2 个答案:

答案 0 :(得分:2)

您可以在TestCaseData类上放置一个抽象验证方法,然后让每个继承此类的类实现它们所需的方式。

public abstract class TestCaseData
{
 public abstract string ID { get; set; }
 public abstract string Name{ get; set; }
 public abstract bool Validate();
}

然后为TestCaseInputList集合中的每个条目调用此方法。

答案 1 :(得分:0)

如果您致力于最初构想的代码模式(即在每个对象上调用验证方法),那么关于抽象方法的答案是最佳解决方案。但也许最好在其setter中验证每个字段:

public abstract class TestCaseData
{
    private string id, name;

    public abstract string ID { get; set; }
    public abstract string Name{ get; set; }
}

public class DerivedClassOne : TestCaseData
{
    public override string ID
    {
        get { return id; }
        set
        {
            if ( ... ) throw new ArgumentException();

            ...

            id = value;
        }
    }

    ...
}

这样一旦遇到无效值就会抛出异常。想象一下,如果您在检查每个对象是否有效之前创建了一百万个这些对象,那么只会发现第一个对象无效。该解决方案通过在设置属性时主动验证来避免这种情况。