Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用单独的类在C中验证信用卡号码_C#_Class_Constructor_Enums - Fatal编程技术网

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

C# 如何使用单独的类在C中验证信用卡号码,c#,class,constructor,enums,C#,Class,Constructor,Enums,我已经建立了一个类来验证信用卡号码。信用卡类型和号码在单独类别的表格中选择。我正在尝试找出如何将在其他类别frmPayment中选择的信用卡类型和号码输入到我的信用卡类别算法中: public enum CardType { MasterCard, Visa, AmericanExpress } public sealed class CardValidator { public static string SelectedCardType { get; private set

我已经建立了一个类来验证信用卡号码。信用卡类型和号码在单独类别的表格中选择。我正在尝试找出如何将在其他类别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);
} }在frmPayments btnValidate\u单击或类似的事件处理程序中,只需调用CardValidator.Validate方法

但是,CardValidator构造函数有参数,即使它是私有的,并且从未调用过?为什么要在类中添加属性

编辑:缺少一些示例代码。

在frmPayments btnValidate\u单击或类似的事件处理程序,只需调用CardValidator.Validate方法

但是,CardValidator构造函数有参数,即使它是私有的,并且从未调用过?为什么要在类中添加属性


编辑:遗漏了一些示例代码。

对于初学者,我会使用正则表达式对所有数字、特定长度进行简单验证

但就你的问题而言,我不确定我是否理解问题所在。从您在这里发布的内容来看,您可能应该删除构造函数,并将整个内容设置为静态类

public enum CardType
{
    MasterCard,
    Visa,
    AmericanExpress,
}

public static class CardValidator
{
    public static bool Validate(CardType cardType, string cardNumber)
    {
        string strippedCardNumber = Regex.Replace(cardNumber, @"\D", String.Empty);


        ICardValidator validator = SelectCardValidator(cardType);

        return validator.Validate(strippedCardNumber);
    }

    private static ICardValidator SelectCardValidator(CardType cardType)
    {
        switch (cardType)
        {
            case CardType.MasterCard:
                return new MasterCardValidator();
            case CardType.Visa:
                return new VisaValidator();
            case CardType.AmericanExpress:
                return new AmericanExpressValidator();
            default:
                return new UnknownCardTypeValidator();
        }
    }

    private interface ICardValidator
    {
        bool Validate(string cardNumber);
    }

    private class UnknownCardTypeValidator : ICardValidator
    {
        #region ICardValidator Members

        public bool Validate(string cardNumber)
        {
            return false;
        }

        #endregion
    }

    private abstract class LuhnAlgorithmValidator : ICardValidator
    {

        #region ICardValidator Members

        public virtual bool Validate(string cardNumber)
        {
            // Implement Luhn Algorithm here

            return false;
        }

        #endregion
    }

    private class MasterCardValidator : LuhnAlgorithmValidator
    {
        public override bool Validate(string cardNumber)
        {
            bool isValid = false; // replace with MasterCard validation
            return isValid && base.Validate(cardNumber);
        }
    }

    private class VisaValidator : LuhnAlgorithmValidator
    {
        public override bool Validate(string cardNumber)
        {
            bool isValid = false; // replace with Visa validation
            return isValid && base.Validate(cardNumber);
        }
    }

    private class AmericanExpressValidator : LuhnAlgorithmValidator
    {
        public override bool Validate(string cardNumber)
        {
            bool isValid = false; // replace with AmEx validation
            return isValid && base.Validate(cardNumber);
        }
    }
}

对于初学者,我会使用正则表达式对所有数字、特定长度进行简单验证

但就你的问题而言,我不确定我是否理解问题所在。从您在这里发布的内容来看,您可能应该删除构造函数,并将整个内容设置为静态类

public enum CardType
{
    MasterCard,
    Visa,
    AmericanExpress,
}

public static class CardValidator
{
    public static bool Validate(CardType cardType, string cardNumber)
    {
        string strippedCardNumber = Regex.Replace(cardNumber, @"\D", String.Empty);


        ICardValidator validator = SelectCardValidator(cardType);

        return validator.Validate(strippedCardNumber);
    }

    private static ICardValidator SelectCardValidator(CardType cardType)
    {
        switch (cardType)
        {
            case CardType.MasterCard:
                return new MasterCardValidator();
            case CardType.Visa:
                return new VisaValidator();
            case CardType.AmericanExpress:
                return new AmericanExpressValidator();
            default:
                return new UnknownCardTypeValidator();
        }
    }

    private interface ICardValidator
    {
        bool Validate(string cardNumber);
    }

    private class UnknownCardTypeValidator : ICardValidator
    {
        #region ICardValidator Members

        public bool Validate(string cardNumber)
        {
            return false;
        }

        #endregion
    }

    private abstract class LuhnAlgorithmValidator : ICardValidator
    {

        #region ICardValidator Members

        public virtual bool Validate(string cardNumber)
        {
            // Implement Luhn Algorithm here

            return false;
        }

        #endregion
    }

    private class MasterCardValidator : LuhnAlgorithmValidator
    {
        public override bool Validate(string cardNumber)
        {
            bool isValid = false; // replace with MasterCard validation
            return isValid && base.Validate(cardNumber);
        }
    }

    private class VisaValidator : LuhnAlgorithmValidator
    {
        public override bool Validate(string cardNumber)
        {
            bool isValid = false; // replace with Visa validation
            return isValid && base.Validate(cardNumber);
        }
    }

    private class AmericanExpressValidator : LuhnAlgorithmValidator
    {
        public override bool Validate(string cardNumber)
        {
            bool isValid = false; // replace with AmEx validation
            return isValid && base.Validate(cardNumber);
        }
    }
}

你错过了一个更好的面向对象编程和更简洁代码的好机会

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

你错过了一个更好的面向对象编程和更简洁代码的好机会

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

+1关于第二段。您可能不希望ctor接受参数,然后可能在方法中忽略它们。如果是我,我会将唯一的ctor设置为私有,删除这两个属性,并保持整个类的静态。然后,当我想验证时,调用CardValidator.Validatetype,number;还没做完。我刚到我想从我的实习课开始试着打电话给它的地方,但还没想好怎么做。这就是为什么我的构造函数还不完全存在的原因。我只是在第二段+1之前没有做过这样的。您可能不希望ctor接受参数,然后可能在方法中忽略它们。如果是我,我会将唯一的ctor设置为私有,删除这两个属性,并保持整个类的静态。然后,当我想验证时,调用CardValidator.Validatetype,number;还没做完。我刚到我想从我的实习课开始试着打电话给它的地方,但还没想好怎么做。这就是为什么我的构造函数还不完全存在的原因。我只是以前没做过像这样的是的,看起来不错。我仍然是一个非常初级的程序员,所以我仍然经常犯一些基本的错误。我仍然是一个非常初级的程序员,所以我仍然经常犯一些基本的错误。这是一个非常干净的解决方案。这是一个非常干净的解决方案。