我在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/

10-15 09:10