Mein Code sieht hässlich aus, und ich weiß, es muss ein besserer Weg zu tun, sein, was ich tue:Helfen Sie mir mit dem Schlüsselwort out dieses verrückte Lambda aufzuräumen
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);
...
}
dieses Zeug so weit doesn‘ Mich nicht stören. Es ist, wie ich tryEncryptPassword
aufrufen, die so hässlich aussieht und hat Vervielfältigung, weil ich es aus zwei Methoden aufrufen:
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
);
}
Zwei Teile der Hässlichkeit:
- ich ausdrücklich alle der Parameterliste müssen Typiert den Lambda-Ausdruck wegen des einzigen Parameters
out
. - Die beiden Überladungen von
EncryptPasswordAndDoStuff
nehmen alle die gleichen Parameter außer dem ersten Parameter, der entweder einstring
oder einSecureString
sein kann. So sindmethod1
undmethod2
ziemlich identisch, sie rufen nur verschiedene Überladungen vonEncryptPasswordAndDoStuff
.
Irgendwelche Vorschläge?
Edit (Lösung): endete ich Jeffs Vorschlag mit und zur Änderung der Überlastung von EncryptPasswordAndDoStuff
eine Instanz von EncryptionResult
zurückzukehren. Dann brauchte ich nicht explizit delegate
definiert, und ich den folgenden Code:
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; }
}
Und hier war der Inhalt von method1
, mit method2
sehr ähnlich zu sein:
string rawPassword = "foo";
KeysAndEncrypter keys = getEncryptionKeys();
return tryEncryptPassword(keys,() =>
keys.Encrypter.EncryptPasswordAndDoStuff(
rawPassword, keys.PublicKey, keys.PrivateKey
),
out errorMessage
);
Haben beide Überladungen von EncryptPasswordAndDoStuff eine ähnliche Funktionalität? Und verwenden Sie den Bool-Rückgabewert von Methode1 und Methode2? –
@Ilya: Ja, beide 'EncryptPasswordAndDoStuff' Überladungen machen dasselbe; in der Tat rufen sie nur zwei verschiedene Überladungen einer 'Verschlüsseln' Methode auf, sowie einige andere Sachen. Die 'bool' Rückgabe von' method1' und 'method2' wird von den Aufrufern verwendet, also ist es notwendig. –