'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);
这理论上应该可行,但在我看来仍然有点不必要。
我在 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);
这理论上应该可行,但在我看来仍然有点不必要。