2013-06-05 1 views
1

에서 파생시킬 수있는 방법 특정 형식의 사용을 단순화하기 위해 공통 기본 클래스 <에서 클래스를 파생하여 공통 기본 클래스에서 파생 된 모듬 요소를 처리했습니다. (나는 Dictionary<string,int>MyDict의 모든 인스턴스를 교체 할 경우, 코드도 return 문에 캐스팅없이 잘 작동) 캐스트가 성공한 MyDict 수준에서 일반 사전을 포장하기 전에Dictionary의 하위 집합을 Dictionary <>

//my base class holding a value 
public abstract class A{ public int aValue; } 

//derived classes that actually are stuffed into the dictionary 
public class B : A {...} 
public class C : A {...} 

//wrapper class for dictionary 
public class MyDict : Dictionary<string, A>; 

//my class using the dictionary 
public class MyClass { 

    public MyDict dict = new MyDict();//use an instance of MyDict 

    public MyClass() { ... //fill dict with instances of B and C } 

    //function to return all elements of dict having a given value 
    public MyDict GetSubSet(int testVal) { 
    var ret = dict.Where(e => e.Value.aValue == testVal). 
         ToDictionary(k => k.Key, k => k.Value); 
    return (MyDict) ret; // <- here I get a runtime InvalidCastException 
    } 
} 

.

나는 또한 return ret as MyDict;을 사용하여 결과를 캐스팅하려고했지만 null 값을 반환합니다. object을 통해 다음과 같이 전송하면 return (MyDict) (object) ret;도 InvalidCastException으로 실패합니다.

아무도 정확하게 캐스트를 반환하거나 반환 값을 올바르게 변환하는 방법을 알고 있습니까?

답변

4

ToDictionary의 결과가 MyDict이 아니므로 잘못된 전송 예외가 발생합니다. 이 문제를 해결 IDictionary<string,A> 소요 MyDict에 생성자를 추가하고 GetSubSet 방법에서 해당 생성자를 호출의 결과를 반환하기 위해 :

public class MyDict : Dictionary<string, A> { 
    public MyDict() { 
     // Perform the default initialization here 
     ... 
    } 
    public MyDict(IDictionary<string,A> dict) { 
     // Initialize with data from the dict 
     ... 
    } 
} 
... 
public MyDict GetSubSet(int testVal) { 
    var ret = dict.Where(e => e.Value.aValue == testVal). 
        ToDictionary(k => k.Key, k => k.Value); 
    return new MyDict(ret); 
} 
+0

덕분에 그 힌트, 그것은 작동합니다. 그러나 성능에 미치는 영향 때문에 사전을 복사하지 않도록하는 방법을 찾으려고했습니다. ToDictionary (...)에 의해 반환 값으로 직접 반환되는'Dictionary '을 사용할 방법이 없습니까? – AstaDev

+0

@AstaDev 사전을 참조로 전달하기 때문에'new MyDict'는 아무것도 복사하지 않습니다. 복사본을 만들지 않고 직접 ToDictionary의 반환 값을 사용합니다. 단지 주위에 래퍼를 넣습니다. – dasblinkenlight

관련 문제