如何在静态方法中访问实例成员?

时间:2012-10-13 08:14:53

标签: c# asp.net inheritance static instance-variables

我正在尝试创建类来封装电子邮件,URL,电话号码等对象的验证和逻辑。在第一次尝试中,我发现我在所有类中重复相同的代码,特别是静态IsValidConstructor。所以我决定创建一个基类来将所有相同的代码放入其中。所以有一个基类,其他类继承它。这是抽象,因为我 希望直接使用

public abstract class BaseClass
{
            protected string value;
            private bool isValid;

            public bool IsValid{get { return this.isValid;}}

    protected virtual string RegexPattern{get;}

    protected virtual RegexOptions RegexOption{get;}

    private BaseClase(){}

    protected BaseClass(string value)
    {
        this.isValid = Validator.IsValid(value , RegexPattern, RegexOption);
        this.value = this.isValid ? value : string.Empty;
    }

    public static bool Validate(string value)
    {
        return Validator.IsValid(value ,RegexPattern, RegexOption); // rror
    }

}

public class Email
{
    private override string RegexPattern
    {
        get
        {
            return ".*";
        }
    }

    private override RegexOptions RegexOption
    {
        get
        {
            return RegexOptions.SingleLine;
        }
    }

            public string Address{get {return this.value; }}

    public Email(string address) : base(address){}
}

问题在于BaseClass的静态IsValid方法。在当前代码中,它会抛出错误,因为RegexPatternRegexOption是实例成员。我不想为实例和静态方法两次定义相同的值。如果我使用

,它会工作
const string RegexPattern= ".*";
const RegexOptions RegexOption =RegexOptions.SingleLine;

但我需要能够在子类中覆盖这些值,因此这不适用。并且我已将BaseClass定义为abstract我无法在静态方法中实例化它以访问属性。

因为我想像Email.IsValid("foo@bar.com");那样使用静态方法,我不知道如何通过它传递实例。

那么,如何在此静态方法中访问RegexOptionRegexPattern

2 个答案:

答案 0 :(得分:4)

  

那么,如何在这种静态方法中访问PropOne和PropTwo?

你需要一个实例以某种方式,否则这是一个毫无意义的操作。所以问题是 - 你将如何想要来识别你感兴趣的实例?您真的需要Validate完全是静态的吗?

请注意,如果您期望值在整个类的实例中始终保持不变,而不是具有抽象属性,您可能希望将值设置为BaseClass的构造函数的一部分,并且只保留他们在田野里。

如果你想要实现的是每个子类都有一个单独的验证器,我会将这两个问题分开 - 给每个子类一个不同类型的静态属性 。你无法以多态方式调用它,但听起来好像你真的不想这样。

我们无法真正告诉你的课程在这里要表示什么 - 如果你能给我们更具体的背景,我们可能会更有帮助。

答案 1 :(得分:-1)

您可以尝试将IsValid作为扩展方法。