2

为了简化使用特定类型的字典,我从通用 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
  }
}

在将通用 Dictionary 包装在 MyDict 类中之前,强制转换成功(如果我将所有实例替换为MyDictwith Dictionary<string,int>,代码工作正常,即使没有在 return 语句中强制转换)。

我也尝试使用转换结果,return ret as MyDict;但这将返回一个空值。object像这样进行转换:也会因InvalidCastExceptionreturn (MyDict) (object) ret;而失败。

有人知道如何正确转换/转换返回值吗?

4

1 回答 1

6

你得到一个无效的强制转换异常,因为ToDictionaryis not的结果MyDict。为了解决这个问题,向它添加一个构造函数MyDict,并返回从你的方法IDictionary<string,A>调用该构造函数的结果:GetSubSet

public class MyDict : Dictionary<string, A> {
    public MyDict() {
        // Perform the default initialization here
        ...
    }
    public MyDict(IDictionary<string,A> dict): base(dict) {
        // Initialize with data from the dict if necessary
        ...
    }
}
...
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);
}
于 2013-06-05T15:30:10.160 回答