2016-07-05 5 views
3

일반 함수로 전달 된 사전을 반복하는 데 문제가 있습니다. 예를 들어 DB에서 데이터를로드하는 함수가 있습니다.C# 사전을 통해 반복하여 전달됨

public T Load<T>(...) 

이 함수는 다음과 같이 호출 할 수 있습니다.이 함수는 아무런 문제가 없습니다.

someclasstype data = Load<someclasstype>(...); 

List<someclasstype> data = Load<List<someclasstype>>(...); 

나는 최근에이뿐만 아니라 사전 처리 할 수 ​​있도록 확장하기 위해 노력하고, 그래서처럼 호출했습니다

Dictionary<long, someclasstype> data = Load<Dictionary<long, someclasstype>>(...) 

내가 문제없이 데이터를로드 할 수 있습니다에 저장 사전에 문제 없습니다. 모든 keyvaluepairs이 단계, 사전,에서

는 결과라는 변수에 저장되고, 나는 지금까지

IEnumerator resultIdx = ((IEnumerable)result).GetEnumerator(); 
if (!resultIdx.MoveNext()) 
    return (T)result; 

object kvp = resultIdx.Current; 

으로 너무 좋아를 IEnumerable을 만드는거야. 시계의 키 값과 값 또는 kvp 변수의 마우스 오버를 볼 수 있습니다.

그러나 kvp에서 keyvalue 쌍의 값 부분을 얻는 방법을 알 수 없습니다.

// None of these work - I get compile time errors, unboxing errors, or invalid cast errors. 
object item = ((KeyValuePair<TKey, TValue>)kvp).Value; 

object item = ((KeyValuePair<long, object>)kvp).Value; 

object item = ((T)kvp).Value // Never had a hope for this, but desperation... 

누구에게 어떻게 할 수 있습니까?

+0

반사를 사용합니까? '객체 키 kvp.GetType(). GetProperty ("Key"). GetValue (kvp); 개체 값 kvp.GetType(). GetProperty ("값"). GetValue (kvp); ' 매우 최적화되지는 않았지만 작동 할 수 있습니다 ... – Dede

+0

굉장하고, 감사합니다 ... 완벽하게 작동합니다. 이 함수는 이미 리플렉션을 많이 사용하므로 Im (속도는 그대로)에 대해 걱정하지 않습니다. –

+0

열거자를 가진 부분은 'Load '함수의이 부분입니까, 아니면'Load ' 외부입니까? 왜냐하면 외부에 있다면'Dictionary '에서 제공하는 정확한'GetEnumerator' 메서드를 사용하는 것이 어떨까요? – ckruczek

답변

2

시도 dynamic kvp = resultIdx.Current;를 추가. 그럼 당신은 사용할 수 kvp.Value

1

다음과 같은 두 가지 기능으로 함수를 다시 작성할 수 있습니다.

public Dictionary<long, T> LoadD<T>(...) 

public T Load<T>(...) 
//Or maybe public List<T> Load<T>(...) 

은 그럼 당신은 LoadD에 KeyValuePair<long, T>에 결과를 캐스팅 할 수 있습니다. 코드 다시 작성을 최소화하기 위해 LoadD에서 호출 할 수 있습니다. 의견 데데가 제공

+0

long (이 경우)이 데이터베이스의 기본 키를 나타내므로 공용 문자 LoadD (...)을 피하려고합니다. 이것은 보장 할 수 없지만, 그 기본 키는 완전히 다른 유형이거나 유형의 조합 일 수 있습니다. 오버로드 된 Load() 함수의 전체 스택을 작성하고 싶지 않았습니다. –

+0

@ThereandThat 어때요'사전 LoadD (...)'? :) –

0

답변 :

? "를 사용하여 반사

object key kvp.GetType().GetProperty("Key").GetValue(kvp); 
object value kvp.GetType().GetProperty("Value").GetValue(kvp); 

매우 최적화 된,하지만 작동 할 수 없음 ... - 데데 24"

관련 문제