2014-12-03 12 views
10

Ich verwende StackExchange.Redis, um auf eine Redis-Instanz zuzugreifen.Wie rufe ich Redis StringSet() aus F #

Ich habe folgende Arbeits C# -Code:

public static void Demo() 
{ 
    ConnectionMultiplexer connection = ConnectionMultiplexer.Connect("xxx.redis.cache.windows.net,ssl=true,password=xxx"); 

    IDatabase cache = connection.GetDatabase(); 

    cache.StringSet("key1", "value"); 
} 

Hier ist das, was ich der entsprechende Code F # wäre würde hoffen:

let Demo() = 
    let cx = ConnectionMultiplexer.Connect @"xxx.redis.cache.windows.net,ssl=true,password=xxx" 
    let cache = cx.GetDatabase() 
    cache.StringSet("key1", "value") |> ignore 

jedoch dies nicht kompilieren - ‚Keine Übereinstimmung Überlastungen für Methode StringSet '. Die StringSet-Methode erwartet Argumente vom Typ RedisKey und RedisValue, und in C# scheint etwas Compiler-Magie zu laufen, um die Strings im aufrufenden Code in RedisKey und RedisValue zu konvertieren. Die Magie scheint in F # nicht zu existieren. Gibt es eine Möglichkeit, das gleiche Ergebnis zu erzielen?

+0

Gibt es 'RedisKey.op_Implicit' und' RedisValue.op_Implicit' Betreiber? – Daniel

+0

@Daniel - sieht so aus. Wenn ich nach Definition navigieren ich folgendes .fsi erhalten generiert: Typ RedisKey = ... statisches Element op_Implicit: key: string -> RedisKey statisches Element op_Implicit: key: byte [] -> RedisKey statisches Element op_Implicit : key: RedisKey -> byte [] statischer Member op_Implicit: Schlüssel: RedisKey -> String – Kit

+3

Dann müssen Sie tun 'StringSet (RedisKey.op_Implicit" Schlüssel1 ", RedisValue.op_Implicit" Wert ")'. Diese werden automatisch in C#, aber nicht F # aufgerufen. Sie können auch einen "impliziten" Operator definieren (http://stackoverflow.com/a/10720073/162396). – Daniel

Antwort

11

Hier ist der Arbeits Code, vielen Dank an @ Daniel:

open StackExchange.Redis 
open System.Collections.Generic 

let inline (~~) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit: ^a -> ^b) x) 

let Demo() = 
    let cx = ConnectionMultiplexer.Connect @"xxx.redis.cache.windows.net,ssl=true,password==xxx" 
    let cache = cx.GetDatabase() 

    // Setting a value - need to convert both arguments: 
    cache.StringSet(~~"key1", ~~"value") |> ignore 

    // Getting a value - need to convert argument and result: 
    cache.StringGet(~~"key1") |> (~~) |> printfn "%s" 
+0

für die Frage Ich habe ein ähnliches Problem Ich habe einen String-Schlüssel und Wert ich möchte es in setzen und sie aus redis lassen searchToken = RedisKey.op_Implicit erhalten ("myKey" + Token) Lassen Sie resultValue = cache.StringGet (searchToken) Lassen Sie redisData = RedisValue.op_Implicit (resultValue) Wenn ich dies ausführen, bekomme ich: Der Typ 'RedisValue' unterstützt keine Konvertierung in den Typ ' 'a' Nicht sicher, was ich falsch mache. Wie erkläre ich RedisValue.op_Implicit, dass es tatsächlich eine Zeichenfolge ist? –

Verwandte Themen