'StackExchange.Redis.ITransaction' 不包含 'StringSetAsync' 的定义

'StackExchange.Redis.ITransaction' does not contain a definition for 'StringSetAsync'

我在 Redis 上使用事务并使用 StackExchange.Redis 提供商。

我有一大批用于事务的 StringSetAsync 操作。

我在使用 StringSetAsync 时遇到错误:

RuntimeBinderException 被捕获

'StackExchange.Redis.ITransaction' 不包含 'StringSetAsync'

的定义

堆栈跟踪:

at CallSite.Target(闭包,CallSite,ITransaction,字符串,对象) 在 Repository.RedisDatabaseContextBase.SetRecord(IBasicRedisEntity redisEntity, Boolean isNewRecord)

====

已添加:

这是反映问题的代码示例。 Marc 是对的,一切都是关于 dynamic.

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);

理论上应该可行,但在我看来仍然有点不必要。