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

.net ';StackExchange.Redis.ITransaction';不包含';StringSetAsync';,.net,transactions,redis,stackexchange.redis,.net,Transactions,Redis,Stackexchange.redis,我在Redis上使用事务&使用StackExchange.Redis提供程序 我有一大批用于事务的StringSetAsync操作 我在使用StringSetAsync时出错: 捕获到RuntimeBinderException “StackExchange.Redis.ITransaction”不包含“StringSetAsync”的定义 堆栈跟踪: 在CallSite.Target(闭包、CallSite、ITransaction、字符串、对象) 位于Repository.RedisData

我在Redis上使用事务&使用StackExchange.Redis提供程序

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

我在使用StringSetAsync时出错:

捕获到RuntimeBinderException

“StackExchange.Redis.ITransaction”不包含“StringSetAsync”的定义

堆栈跟踪:

在CallSite.Target(闭包、CallSite、ITransaction、字符串、对象) 位于Repository.RedisDatabaseContextBase.SetRecord(IBasicRedisEntity redisEntity,布尔值为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);
}

在某些方面它是正确的:没有占用
字节[]
的重载。有一种方法需要
RedisValue
,但这不是一回事<代码>动态方法解析可能会出现问题-无论是显式接口实现还是转换运算符:都适用于此处

我建议:

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

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

RuntimeBinderException建议您使用的是
dynamic
-对吗?不,我使用的是泛型。但最后它仍然很简单:transaction.StringSetAsync(key,value);//错误我不想这么说,但是像这样提到
CallSite
:强烈表明
dynamic
在这里起作用-在这种情况下,是的:它将在几种情况下失败(例如显式实现)。您是否有发生这种情况的代码示例?包括任何变量的类型(例如,如果您有
obj.StringSetAsync(…)
,那么什么是
obj
?)是的,我的错。请阅读我编辑的文章。这项工作也在实践中,我同意你的观点:最好检查演员阵容以防止错误。