.net ';StackExchange.Redis.ITransaction';不包含';StringSetAsync';
我在Redis上使用事务&使用StackExchange.Redis提供程序 我有一大批用于事务的StringSetAsync操作 我在使用StringSetAsync时出错: 捕获到RuntimeBinderException “StackExchange.Redis.ITransaction”不包含“StringSetAsync”的定义 堆栈跟踪: 在CallSite.Target(闭包、CallSite、ITransaction、字符串、对象) 位于Repository.RedisDatabaseContextBase.SetRecord(IBasicRedisEntity redisEntity,布尔值为isNewRecord) ==== 补充: 下面是反映问题的代码示例。马克是对的,这一切都是关于动态的.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
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
?)是的,我的错。请阅读我编辑的文章。这项工作也在实践中,我同意你的观点:最好检查演员阵容以防止错误。