我在redis上使用transaction&using stackexchange.redis provider。
我有大量的stringsetasync事务操作。
使用StringSetAsync时出错:
已捕获RuntimeBinderException
“stackexchange.redis.itransaction”不包含“stringsetasync”的定义
堆栈跟踪:
在callsite.target(闭包、callsite、itransaction、字符串、对象)
在repository.redisdatabasecontextbase.setrecord(ibasicredisentity redisentity,boolean isnewrecord)
===
补充:
下面是反映问题的代码示例。马克是对的,一切都是动态的。
try
{
ConnectionMultiplexer cm = ConnectionMultiplexer.Connect("localhost:6380,allowAdmin=true");
var db = cm.GetDatabase();
ITransaction transaction = db.CreateTransaction();
dynamic pp = new byte[5] {1, 2, 3, 4, 5};
transaction.StringSetAsync("test", pp);
if (transaction.Execute())
{
Console.Write("Committed");
}
else
{
Console.Write("UnCommitted");
}
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e);
}
最佳答案
在某些方面是正确的:没有需要byte[]
的过载。有一个需要RedisValue
,但那不是同一件事。dynamic
方法解析可能会有问题-对于显式接口实现和转换运算符:两者都适用于这里!
我建议:
object pp = new byte[5] {1, 2, 3, 4, 5};
if(pp is byte[])
transaction.StringSetAsync("test", (byte[])pp);
else if (pp is string)
transaction.StringSetAsync("test", (string)pp);
else if (pp is RedisValue)
transaction.StringSetAsync("test", (RedisValue)pp);
else
throw new NotSupportedException(
"Value is not usable: " + pp.GetType().FullName);
另一种选择可能是:
dynamic pp = new byte[5] {1, 2, 3, 4, 5};
transaction.StringSetAsync("test", (RedisValue)pp);
这在理论上是可行的,但在国际海事组织看来还是有点不必要的。
关于.net - 'StackExchange.Redis.ITransaction'不包含'StringSetAsync'的定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28071030/