Чтобы упростить использование словаря определенного типа, я создал класс, производный от общего словаря‹>, для обработки различных элементов, полученных из общего базового класса:
//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
}
}
Перед тем, как обернуть общий словарь в класс MyDict, приведение было выполнено успешно (если я заменю все экземпляры MyDict
на Dictionary<string,int>
, код будет работать нормально, даже без приведения в операторе return).
Я также пытался привести результат, используя return ret as MyDict;
, но это вернет нулевое значение. Кастинг через object
следующим образом: return (MyDict) (object) ret;
также завершается с ошибкой InvalidCastException.
Кто-нибудь знает, как правильно преобразовать/преобразовать возвращаемое значение?