에서 파생시킬 수있는 방법 특정 형식의 사용을 단순화하기 위해 공통 기본 클래스 <에서 클래스를 파생하여 공통 기본 클래스에서 파생 된 모듬 요소를 처리했습니다. (나는 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으로 실패합니다.
아무도 정확하게 캐스트를 반환하거나 반환 값을 올바르게 변환하는 방법을 알고 있습니까?
덕분에 그 힌트, 그것은 작동합니다. 그러나 성능에 미치는 영향 때문에 사전을 복사하지 않도록하는 방법을 찾으려고했습니다. ToDictionary (...)에 의해 반환 값으로 직접 반환되는'Dictionary'을 사용할 방법이 없습니까? –
AstaDev
@AstaDev 사전을 참조로 전달하기 때문에'new MyDict'는 아무것도 복사하지 않습니다. 복사본을 만들지 않고 직접 ToDictionary의 반환 값을 사용합니다. 단지 주위에 래퍼를 넣습니다. – dasblinkenlight