Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为派生类对象编写验证方法_C#_Inheritance - Fatal编程技术网

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

C# 如何为派生类对象编写验证方法,c#,inheritance,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 overrid

我从不同类型的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();

您可以在TestCaseData类上放置一个抽象验证方法,然后让继承该类的每个类按照需要的方式实现它

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

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

如果您致力于最初构思的代码模式(即对每个对象调用验证方法),那么关于抽象方法的答案是最佳解决方案。但也许最好验证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;
        }
    }

    ...
}

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

似乎很合理,但我可能更喜欢将验证封装在类构造函数中(尽管有时这是不可能的,因为第三方LIB正在进行解析)。我认为能够假设每个创建的对象都是有效的,而不是让客户端负责到处调用
IsValid()
,这要干净得多。我同意这不是最佳解决方案,但因为问题涉及现有的ValidateCompleteFile方法,这个新的验证方法将从这里调用。实际上,问题是我正在使用TestCaseData、DerivedClassOne、DerivedClass2模型编写客户机代码,并且不能修改类定义(它不提供验证方法)。因此,现在需要在客户端代码中编写一个单独的验证方法,我不想编写两个不同的验证方法,一个用于DerivedClassOne类型,另一个用于DerivedClass2类型。请记住,如果不是每个属性都可以接受的值
null
/
default(t)
,这可能会产生误导!我同意setter验证(尽管我更喜欢构造注入/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;
        }
    }

    ...
}