2015-01-21 6 views
1

StackExchange.Redis 공급자를 사용하여 Redis &에서 트랜잭션을 사용하고 있습니다.'StackExchange.Redis.ITransaction'에 'StringSetAsync'에 대한 정의가 없습니다.

나는 트랜잭션을위한 StringSetAsync 작업의 큰 배치를 가지고있다.

그리고 StringSetAsync 사용 중 오류가있어 :

RuntimeBinderException이 잡힌

'StackExchange.Redis.ITransaction가'StringSetAsync '

스택 추적에 대한 정의가 포함되어 있지 않습니다

at CallSite.Target (Closure, CallSite, ITransaction, String, Object) 에서 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); 
} 
+0

RuntimeBinderException은 당신이'dynamic'을 사용하고 있다고 제안합니다 - 정확합니까? –

+0

아니요, 제네릭을 사용하고 있습니다. 하지만 결국 그것은 간단히 : transaction.StringSetAsync (key, value); // error –

+0

나는 이것을 싫어하지만, 다음과 같은'CallSite'에 대한 언급은 ** 동적으로 ** 동적 인 것을 제안한다. - 어떤 경우에는 그렇다 : 몇몇 시나리오 (명시 적 구현, 예를 들어). 이런 일이 발생하는 코드의 예가 있습니까? 모든 변수의 유형 포함 (예 :'obj.StringSetAsync (...) '가있는 경우'obj'는 무엇입니까?) –

답변

0

은 어떤면에서 그것은 올바른 : byte[] 걸리는 과부하가 없습니다. RedisValue을 사용하는 사람이 있지만 은 같은 것이 아닙니다.. dynamic 명시 적 인터페이스 구현과 변환 연산자 모두에 대해 메소드 해상도가 이상 할 수 있습니다. 둘 다 여기에 적용됩니다!

dynamic pp = new byte[5] {1, 2, 3, 4, 5}; 
transaction.StringSetAsync("test", (RedisValue)pp); 

이론에서 작동해야하지만 IMO 여전히 조금 불필요 :

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

대안이 될 수 있습니다

나는 건의 할 것입니다.

+0

연습에서도이 작업이 가능합니다. 오류가 발생하지 않도록 캐스팅을 잘 확인하십시오. –

관련 문제