如何使用单独的类来验证C#中的信用卡号

Eva*_*yan 1 c# enums constructor class

我已经设置了一个类来验证信用卡号码.信用卡类型和编号在单独的类中的表单上选择.我正在试图弄清楚如何获得在我的信用卡类算法中在其他类(frmPayment)中选择的信用卡类型和号码:

public enum CardType
{
    MasterCard, Visa, AmericanExpress
}

public sealed class CardValidator
{
    public static string SelectedCardType { get; private set; }
    public static string CardNumber { get; private set; }

    private CardValidator(string selectedCardType, string cardNumber) 
    {
        SelectedCardType = selectedCardType;
        CardNumber = cardNumber;
    }

    public static bool Validate(CardType cardType, string cardNumber)
{
   byte[] number = new byte[16];


  int length = 0;
  for (int i = 0; i < cardNumber.Length; i++)
  {
      if (char.IsDigit(cardNumber, i))
      {
          if (length == 16) return false;
          number[length++] = byte.Parse(cardNumber[i]); //not working.  find different way to parse
      }
  }

  switch(cardType)
  {
     case CardType.MasterCard:
        if(length != 16)
           return false;
        if(number[0] != 5 || number[1] == 0 || number[1] > 5)
           return false;
        break;

     case CardType.Visa:
        if(length != 16 & length != 13)
           return false;
        if(number[0] != 4)
           return false;
        break;

     case CardType.AmericanExpress:
        if(length != 15)
           return false;
        if(number[0] != 3 || (number[1] != 4 & number[1] != 7))
           return false;
        break;

  }

  // Use Luhn Algorithm to validate
  int sum = 0;
  for(int i = length - 1; i >= 0; i--)
  {
     if(i % 2 == length % 2)
     {
        int n = number[i] * 2;
        sum += (n / 10) + (n % 10);
     }
     else
        sum += number[i];
  }
  return (sum % 10 == 0);
Run Code Online (Sandbox Code Playgroud)

}}

Aus*_*nen 5

你错过了一个更好的OOP和更清晰的代码的好机会.

class CreditCard
{
   public CreditCard(string number, string expiration, string cvv2) {...}

   public virtual bool IsValid()
   {
       /* put common validation logic here */
   }

   /* factory for actual cards */
   public static CreditCard GetCardByType (CardType card, string number, string expiration, string cvv2)
   {
        switch (card)
        {
             case  CardType.Visa:
                  return new VisaCreditCard(...);

             ...
        }
   }
}

class VisaCreditCard : CreditCard
{
   public VisaCreditCard (string number, string expiration, string cvv2 )
      : base (number, expiration, cvv2)
   {...}

   public override bool IsValid()
   {
       /* check Visa rules... */
       bool isValid = ...

       return isValid & base.IsValid();
   }
}
Run Code Online (Sandbox Code Playgroud)