Мой код выглядит ужасно, и я знаю, что должен быть лучший способ сделать то, что я делаю:
private delegate string doStuff(
PasswordEncrypter encrypter, RSAPublicKey publicKey,
string privateKey, out string salt
);
private bool tryEncryptPassword(
doStuff encryptPassword,
out string errorMessage
)
{
...get some variables...
string encryptedPassword = encryptPassword(encrypter, publicKey,
privateKey, out salt);
...
}
Этот материал меня пока не беспокоит. Это то, как я звоню tryEncryptPassword
, это выглядит так ужасно и имеет дублирование, потому что я вызываю его двумя методами:
public bool method1(out string errorMessage)
{
string rawPassword = "foo";
return tryEncryptPassword(
(PasswordEncrypter encrypter, RSAPublicKey publicKey,
string privateKey, out string salt) =>
encrypter.EncryptPasswordAndDoStuff( // Overload 1
rawPassword, publicKey, privateKey, out salt
),
out errorMessage
);
}
public bool method2(SecureString unencryptedPassword,
out string errorMessage)
{
return tryEncryptPassword(
(PasswordEncrypter encrypter, RSAPublicKey publicKey,
string privateKey, out string salt) =>
encrypter.EncryptPasswordAndDoStuff( // Overload 2
unencryptedPassword, publicKey, privateKey, out salt
),
out errorMessage
);
}
Две части уродства:
- Мне нужно явно перечислить все типы параметров в лямбда-выражении из-за одного
out
параметра.
- Две перегрузки
EncryptPasswordAndDoStuff
принимают все те же параметры, кроме первого параметра, который может быть либо string
, либо SecureString
. Так что method1
и method2
в значительной степени идентичны, они просто вызывают различные перегрузки EncryptPasswordAndDoStuff
.
Есть предложения?
Редактировать (решение): В итоге я воспользовался предложением Джеффа и изменил перегрузки EncryptPasswordAndDoStuff
, чтобы вернуть экземпляр EncryptionResult
. Тогда мне не нужно явно определенное delegate
, и я использовал следующий код:
private bool tryEncryptPassword(KeysAndEncrypter keys,
Func<EncryptionResult> encryptPassword,
out string errorMessage
) { ... }
private class KeysAndEncrypter
{
public RSAPublicKey PublicKey { get; set; }
public string PrivateKey { get; set; }
public PasswordEncrypter Encrypter { get; set; }
}
А вот содержимое method1
, с method2
очень похожим:
string rawPassword = "foo";
KeysAndEncrypter keys = getEncryptionKeys();
return tryEncryptPassword(keys, () =>
keys.Encrypter.EncryptPasswordAndDoStuff(
rawPassword, keys.PublicKey, keys.PrivateKey
),
out errorMessage
);