在启动 class 的两个成员后启动 class 参数

initiate class parameters after initiating two members of class

首先,如果这是一个愚蠢的问题,我深表歉意。我是 .net 的新手。

我有一部手机 class 是这样的:

    public class Mobile
{
    private string region;
    private string number;
    private bool regionIsValid;
    private bool numberContentIsValid;
    private string internationalNumber;

    public string Region
    {
        set { region = value.ToUpper(); ConvertNumber(); }
        get { return region; }
    }
    public string Number
    {
        set { number = value; ConvertNumber(); }
        get { return number; }
    }
    public Interface Reason
    {
        set { reason = value; }
        get { return reason; }
    }
    public bool NumberContentIsValid
    {
        set { numberContentIsValid = value; }
        get { return numberContentIsValid; }
    }
    public string InternationalNumber
    {
        set { internationalNumber = value; }
        get { return internationalNumber; }
    }

    public void ConvertNumber()
    {
        var sw = Stopwatch.StartNew();

        try
        {
            if (Number == null || Region == null || DoesNumberContentValid() == false || NumberContentIsValid == false)
                return;

            var phoneUtil = PhoneNumberUtil.GetInstance();
            var phone = phoneUtil.Parse(Number, Region);
            InternationalNumber = phoneUtil.Format(phone, PhoneNumberFormat.INTERNATIONAL);

            Log.GetLogger().Info(Format.CreateLogMessage("converting mobile number completed successfully.", sw.Elapsed.TotalMilliseconds));
            return;
        }
        catch (Exception ex)
        {
            Log.GetLogger().Error(Format.CreateLogMessage(ex.ToString(), sw.Elapsed.TotalMilliseconds));
            return;
        }

    }
    public bool DoesNumberContentValid()
    {
        var sw = Stopwatch.StartNew();
        var len = new Regex(@"^.{2,20}$"); //length at least 6 characters and maximum of 20
        var digit = new Regex(@"^[0-9]*$"); //a string consisting only of numbers

        if (number.StartsWith(@"+") == true) number = number.Substring(1);
        number = number.Replace(" ", string.Empty);

        try
        {
            if (!len.IsMatch(Number))
            {
                NumberContentIsValid = false;
                Reason = new Interface("G00005");
            }
            else if (!digit.IsMatch(Number))
            {
                NumberContentIsValid = false;
                Reason = new Interface("G00005");
            }
            else if (Region != "IR")
            {
                NumberContentIsValid = false;
                Reason = new Interface("G00005");
            }
            else
            {
                var phoneUtil = PhoneNumberUtil.GetInstance();
                var mobile = phoneUtil.Parse(Number, Region);
                if (phoneUtil.IsValidNumber(mobile) != true)
                {
                    NumberContentIsValid = false;
                    Reason = new Interface("G00005");
                }
                else if (phoneUtil.GetNumberType(mobile).ToString() != "MOBILE")
                {
                    NumberContentIsValid = false;
                    Reason = new Interface("G00005");
                }
                else
                    NumberContentIsValid = true;
            }

            Log.GetLogger().Info(Format.CreateLogMessage("mobile content validation completed successfully.", sw.Elapsed.TotalMilliseconds));
            return true;
        }
        catch (Exception ex)
        {
            Reason = new Interface("G00001", ex.Message);
            Log.GetLogger().Error(Format.CreateLogMessage(ex.ToString(), sw.Elapsed.TotalMilliseconds));
            return false;
        }
    }
}

如果 NumberRegion 都可用,我想启动 internationalNumber。请看看我的convertnumber()方法:

        public void ConvertNumber()
    {
        var sw = Stopwatch.StartNew();

        try
        {
            if (Number == null || Region == null || DoesNumberContentValid() == false || NumberContentIsValid == false)
                return;

            var phoneUtil = PhoneNumberUtil.GetInstance();
            var phone = phoneUtil.Parse(Number, Region);
            InternationalNumber = phoneUtil.Format(phone, PhoneNumberFormat.INTERNATIONAL);

            Log.GetLogger().Info(Format.CreateLogMessage("converting mobile number completed successfully.", sw.Elapsed.TotalMilliseconds));
            return;
        }
        catch (Exception ex)
        {
            Log.GetLogger().Error(Format.CreateLogMessage(ex.ToString(), sw.Elapsed.TotalMilliseconds));
            return;
        }

    }

为了做到这一点,我使用 NumberRegion 属性 setter 像这样:

public string Region
{
    set { region = value.ToUpper(); ConvertNumber(); }
    get { return region; }
}
public string Number
{
    set { number = value; ConvertNumber(); }
    get { return number; }
}

有效。但它可能会导致意外错误(如果看看我的 DoesNumberContentValid() 方法,你就会意识到。提示:我必须使用 number 而不是 Number) 现在我想知道有更好的方法吗? (显然我不能使用 class 承包商,因为我不能同时启动两个参数。)

谢谢。

也许这对你有用:

public string InternationalNumber
{
    set { internationalNumber = value; }
    get { return internationalNumber ?? CalcInternationalNumber(); }
}

和函数 CalcInternationalNumber:

public string CalcInternationalNumber()
{
    var sw = Stopwatch.StartNew();

    try
    {
        if (Number == null || Region == null || DoesNumberContentValid() == false || NumberContentIsValid == false)
            return null;

        var phoneUtil = PhoneNumberUtil.GetInstance();
        var phone = phoneUtil.Parse(Number, Region);
        var intNum = phoneUtil.Format(phone, PhoneNumberFormat.INTERNATIONAL);

        Log.GetLogger().Info(Format.CreateLogMessage("converting mobile number completed successfully.", sw.Elapsed.TotalMilliseconds));
        return intNum;
    }
    catch (Exception ex)
    {
        Log.GetLogger().Error(Format.CreateLogMessage(ex.ToString(), sw.Elapsed.TotalMilliseconds));
        return null;
    }

}

希望这就是您要找的。