c# – 获取给定类型的集合的引用

前端之家收集整理的这篇文章主要介绍了c# – 获取给定类型的集合的引用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有几个词典:
Dictionary<int,Type1> Type1Dictionary { get; set; }
Dictionary<int,Type2> Type2Dictionary { get; set; }
Dictionary<int,Type3> Type3Dictionary { get; set; }
Dictionary<int,Type4> Type4Dictionary { get; set; }

其中Typei(i = 1..4)派生自相同的基类(BaseType).我想要一个方法,返回给定类型的字典的引用.稍后,我将在该字典上执行一些操作,如添加删除

Type1 example = new Type1(); 
var dic = GetDictionary(example);
dic.Add(example.ID,example);

注意:我不想将我的词典设置为Dictionary< int,BaseType>

我可以写这样的东西,但不会返回对字典的引用:

Dictionary<int,BaseType> GetDictionary(BaseType myObject)
{
    var dic = new Dictionary<int,BaseType>();
    if(myObject is Type1)
    {
    //ideally I would return my Type1Dictionary here but I can't due type incompatibility
       foreach(var x in Type1Dictionary)
       {
            dic.Add(x.Key,x.Value);
       }
       return dic;
    }
    if(myObject is Type2) { /*...*/ }
    if(myObject is Type3) { /*...*/ }
    if(myObject is Type4) { /*...*/ }
}

编辑:

我真正想要的是避免以下结构:

AddObject(BaseType x)
{
    Type1 x1 = x as Type1;
    if(x1 != null) { Type1Dictionary.Add(x1.ID,x1); }

    Type2 x2 = x as Type2;
    if(x2 != null) { Type2Dictionary.Add(x2.ID,x2); }

    Type3 x3 = x as Type3;
    if(x3 != null) { Type3Dictionary.Add(x3.ID,x3); }

    Type4 x4 = x as Type4;
    if(x4 != null) { Type4Dictionary.Add(x4.ID,x4); }
}

RemoveObject(BaseType x)
{
    Type1 x1 = x as Type1;
    if(x1 != null) { Type1Dictionary.Remove(x1.ID); }

    Type2 x2 = x as Type2;
    if(x2 != null) { Type2Dictionary.Remove(x2.ID); }

    Type3 x3 = x as Type3;
    if(x3 != null) { Type3Dictionary.Remove(x3.ID); }

    Type4 x4 = x as Type4;
    if(x4 != null) { Type4Dictionary.Remove(x4.ID); }
}

但反而:

AddObject(BaseType x)
{
    var dic = GetDictionary(x);
    dic.Add(x.ID,x);
}

RemoveObject(BaseType x)
{
    var dic = GetDictionary(x);
    dic.Remove(x.ID);
}

解决方法

这可以根据安全性等方面进行抛光.但是你应该能够得到基本的想法:
public interface IEntity
{
  int ID { get; }
}

public class Superset<T> where T : IEntity
{
  public Dictionary<Type,Dictionary<int,T>> m_Map = 
    new Dictionary<Type,T>>();

  private Dictionary<int,T> GetDictionary(Type t)
  {
    Dictionary<int,T> result = null;
    if (!m_Map.TryGetValue(t,out result))
    {
      result = new Dictionary<int,T>();
      m_Map.Add(t,result);
    }
    return result;
  }

  public void Add<K>(K item) where K : T
  {
    GetDictionary(typeof(K)).Add(item.ID,item);
  }

  public bool Remove<K>(K item) where K : T
  {
    return GetDictionary(typeof(K)).Remove(item.ID);
  }
}

猜你在找的C#相关文章