2015-10-04 32 views
0

的两个成员之后启动类参数,起初我很抱歉,如果它是一个愚蠢的问题。我是.net新手。在启动类别

我有一个移动类是这样的:

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; 
     } 
    } 
} 

我想发起internationalNumber如果NumberRegion都是可用的。请大家看看我的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的属性设置是这样的:

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

它的工作原理。但它可能会导致意外的错误(你意识到如果看看我的DoesNumberContentValid()方法。tips:我必须用number而不是Number) 现在我想知道有没有更好的方法来做到这一点? (忘记我不能使用班级承包商,因为我不能同时启动两个参数。)

谢谢。

+0

国际号码属性总是与其他两个属性相关吗?您确定要允许用户分别设置国际号码属性吗? –

+0

谢谢亲爱的@ Maor Veitsman。是的,国际号码总是与其他两个属性有关,我想单独分析国际号码属性。 – David

+0

可以肯定的是,InternationalNumber属性应该有一个私人设置者,对吧? –

回答

1

也许这会为你工作:

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; 
    } 

} 

希望这是你所期待的。

+0

谢谢亲爱的@Maor Veitsman。我想是的。 – David

+1

很高兴帮助! –