C# 如何在C语言中编写具有多个参数的扩展方法?

C# 如何在C语言中编写具有多个参数的扩展方法?,c#,asp.net,web,extension-methods,C#,Asp.net,Web,Extension Methods,我编写了这个扩展方法,但只得到一个参数 我的C代码: public static string ToEncrypt(this string key, string passWord) { // Salt and IV is randomly generated each time, but is prepended to encrypted cipher text // so that the same Salt and IV values can be used when de

我编写了这个扩展方法,但只得到一个参数

我的C代码:

public static string ToEncrypt(this string key, string passWord)
{
    // Salt and IV is randomly generated each time, but is prepended to encrypted cipher text
    // so that the same Salt and IV values can be used when decrypting.  
    var saltStringBytes = Generate256BitsOfRandomEntropy();
    var ivStringBytes = Generate256BitsOfRandomEntropy();
    var plainTextBytes = Encoding.UTF8.GetBytes(key);

    using (var password = new Rfc2898DeriveBytes(passWord, saltStringBytes, DerivationIterations))
    {
        var keyBytes = password.GetBytes(Keysize / 8);

        using (var symmetricKey = new RijndaelManaged())
        {
            symmetricKey.BlockSize = 256;
            symmetricKey.Mode = CipherMode.CBC;
            symmetricKey.Padding = PaddingMode.PKCS7;

            using (var encryptor = symmetricKey.CreateEncryptor(keyBytes, ivStringBytes))
            {
                using (var memoryStream = new MemoryStream())
                {
                    using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
                    {
                        cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
                        cryptoStream.FlushFinalBlock();
                        // Create the final bytes as a concatenation of the random salt bytes, the random iv bytes and the cipher bytes.
                        var cipherTextBytes = saltStringBytes;
                        cipherTextBytes = cipherTextBytes.Concat(ivStringBytes).ToArray();
                        cipherTextBytes = cipherTextBytes.Concat(memoryStream.ToArray()).ToArray();
                        memoryStream.Close();
                        cryptoStream.Close();

                        return Convert.ToBase64String(cipherTextBytes);
                    }
                }
            }
        }
    }
}
我尝试使用这种扩展方法:

我在谷歌上搜索过,但找不到解决问题的方法


谢谢大家!对不起,我的英语不好

我想您正在尝试编写一个扩展方法,用密钥加密密码。 因此,函数头应该是:

public static string ToEncrypt(this string passWord, string key)
稍后,您可以使用此扩展,如下所示:

string encrpted = password.ToEncrypt("your key here");

我认为您正在尝试编写一个扩展方法来用密钥加密密码。 因此,函数头应该是:

public static string ToEncrypt(this string passWord, string key)
稍后,您可以使用此扩展,如下所示:

string encrpted = password.ToEncrypt("your key here");

您的问题是,您的扩展方法是为它所作用的字符串编写的,该字符串是“键”,而不是“密码”

因此,您的代码在编写时应该是

var key = “some key”;
var encryptedpass = key.ToEncrypt(password);

代码甚至不引用键,但扩展方法引用

您的问题是,您的扩展方法是为它所作用的字符串编写的,该字符串是“键”,而不是“密码”

因此,您的代码在编写时应该是

var key = “some key”;
var encryptedpass = key.ToEncrypt(password);

代码甚至不引用键,但扩展方法引用

我不明白问题出在哪里。扩展方法是一种自己至少接收一个参数的方法。第一个参数的类型是具有此方法的类型,就像它在原始类中一样。因此,由于您的方法有两个参数,当作为扩展方法调用时,它将有一个参数:密码。那么你的问题是什么呢?是的,正如@Andrew所说,将第一个参数看作是调用扩展方法的对象。您可能想在方法声明中切换密钥和密码的顺序。我同意@Ben,我认为这是您的问题。顺便说一句,您的方法应该被称为Encrypt,或者被称为toencrypt。我强烈反对使用两个名称如此相似的变量:password和password。如果这是为了存储用户密码,那么应该对它们进行散列,而不是加密。您永远不能将用户密码转换为明文。您应该将用户输入的密码哈希值与存储在数据库中的哈希值进行比较。如果这是针对用户密码的,请研究存储密码的最佳方法。我不明白问题是什么。扩展方法是一种自己至少接收一个参数的方法。第一个参数的类型是具有此方法的类型,就像它在原始类中一样。因此,由于您的方法有两个参数,当作为扩展方法调用时,它将有一个参数:密码。那么你的问题是什么呢?是的,正如@Andrew所说,将第一个参数看作是调用扩展方法的对象。您可能想在方法声明中切换密钥和密码的顺序。我同意@Ben,我认为这是您的问题。顺便说一句,您的方法应该被称为Encrypt,或者被称为toencrypt。我强烈反对使用两个名称如此相似的变量:password和password。如果这是为了存储用户密码,那么应该对它们进行散列,而不是加密。您永远不能将用户密码转换为明文。您应该将用户输入的密码哈希值与存储在数据库中的哈希值进行比较。如果这是针对用户密码的,请研究存储密码的最佳方法。