C# 如何为派生类对象编写验证方法
我从不同类型的CSV文件中读取用户输入,这些文件有一些共同的和不同的属性。我创建了一个基类TestCaseData和派生类,如下所示: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
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;
}
}
...
}