我可以拥有通用的[]属性吗?

时间:2011-08-12 16:09:09

标签: c# generics

我有一个DICOM字典,其中包含一组所有从DataElement派生的对象。 字典有一个int作为键,DataElement作为属性。 我的DICOM字典包含this []属性,我可以在其中访问DataElement,如下所示:

public class DicomDictionary
{
  Dictionary<int, DataElement> myElements = new Dictionary<int, DataElement>();
  .
  .
  public DataElement this[int DataElementTag]
  {
    get
    {
      return myElements[int];
    }
  }
}

现在的问题是我有不同的DataElement类型,它们都是从DataElement派生的,比如DataElementSQ,DataElementOB等。我现在想要做的是使C#中的写作更容易:

 public T this<T>[int DataElementTag] where T : DataElement
 {
   get
   {
      return myElements[int];
   }
 }

但这不可能。有没有我错过的东西?当然我可以用Getter方法做到这一点,但以这种方式使用它会更好。

4 个答案:

答案 0 :(得分:4)

最好的选择是使用泛型方法(而不是索引器),或者让您的类是通用的(在这种情况下,索引器将绑定到类泛型类型)。您在C#中不允许使用您所描述的通用索引器。

答案 1 :(得分:3)

为什么不使用真正的通用方法GetDataElement<T> where T : DataElement呢? C#不支持通用索引器。为什么你认为在这种情况下索引器比方法更好?

答案 2 :(得分:2)

是你的情况吗?

public class DicomDictionary<TElement> 
{
        Dictionary<int, TElement> myElements = new Dictionary<int, TElement>();
        public TElement this[int DataElementTag]   
        {     
              get     
              {       
                 return myElements[int];     
              }   
        } 
}

答案 3 :(得分:0)

附加的所有答案是:

public class Acessor<TKey, TValue>
    where TKey : IComparable
    where TValue : class
{
    Dictionary<TKey, TValue> myElements = new Dictionary<TKey, TValue>();

    public TValue this[TKey key]
    {
        get
        {
            return myElements[key];
        }
        set
        {
            myElements.Add(key, value);
        }
    }
}

或者不更改班级签名:

 public class Acessor
{
    Dictionary<string, object> myElements = new Dictionary<string, object>();

    public object this[string key]
    {
        get
        {
            return myElements[key];
        }
        set
        {
            myElements.Add(key, value);
        }
    }
}

创建一个解析泛型类型的方法:

public T Get<T>(string key)
        where T : class
    {
        return (T)Convert.ChangeType(acessor[key], typeof(T));
    }