2011-08-12 34 views
7

Tôi có một từ điển DICOM có chứa một tập hợp các đối tượng tất cả bắt nguồn từ DataElement. Từ điển có một int là một khóa, và DataElement là tài sản. điển DICOM My chứa một [] bất động sản này, nơi tôi có thể truy cập vào DataElement, như thế này:Tôi có thể có thuộc tính [] chung này không?

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

Một vấn đề bây giờ là tôi có các loại DataElement khác nhau tất cả bắt nguồn từ DataElement, như DataElementSQ, DataElementOB và vân vân. Những gì tôi muốn làm bây giờ là sau đây để làm cho văn bản trong C# một chút dễ dàng hơn:

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

Nhưng điều này là không thực sự có thể. Có điều gì tôi đã bỏ lỡ? Tất nhiên tôi có thể làm điều đó với phương pháp Getter, nhưng sẽ tốt hơn nếu có nó theo cách này.

+1

Bạn không thể có các thuộc tính Chung (bao gồm các chỉ mục) http://stackoverflow.com/questions/494827/why-it-is-not-posible-to-define-generic-indexers-in-net –

+0

Cho dù bạn có tin hay không, những gì bạn đang đề xuất làm sẽ gây nhầm lẫn để sử dụng và đọc, imo. – Marc

Trả lời

3

Tại sao không sử dụng phương pháp chung chung thực sự GetDataElement<T> where T : DataElement thay thế? Các chỉ mục chung không được hỗ trợ trong C#. Tại sao bạn nghĩ trong trường hợp này một người lập chỉ mục là tốt hơn so với một phương pháp?

+0

Xin chào Danny, đây là những gì tôi mong đợi. Vấn đề của việc có một phương thức getter, và trong thực tế, tôi có một phương thức như vậy là nó làm cho mã không thể đọc được nhiều hơn sau đó có nó như phương thức ngắn tay này. Tất nhiên nếu tôi phải bỏ nó, thì đây cũng không phải là trường hợp. Đây là lý do tại sao tôi đang tìm kiếm một thứ như vậy. Hiện tại tôi có thể sống với nó, nhưng câu hỏi này xuất hiện trong đầu tôi. – msedi

4

Các tùy chọn tốt nhất là sử dụng một phương pháp chung (thay vì chỉ mục) hoặc để lớp của bạn là chung (trong trường hợp này, trình chỉ mục sẽ được gắn với loại chung của lớp). Trình chỉ mục chung như bạn đã mô tả không được phép trong C#.

+0

Hi Reed, bạn đúng Tôi có thể tạo ra một lớp chung chung, nhưng tôi đã cố gắng không có một cái gì đó như thế, bởi vì hiện tại nó đang làm việc mà không có một lớp chung chung. – msedi

+0

@msedi: Một phần của vấn đề, với những gì bạn đang hiển thị, là từ điển có thể chứa nhiều loại - bạn không có cách nào để đảm bảo an toàn loại trong mã hiện tại của bạn (ngay cả khi nó hoạt động). Điều đó đang được nói, thông số C# không hỗ trợ nó ... –

+0

@msedi: Nếu bản thân lớp không biết loại indexer sẽ trả về thì cái gì? Nó sẽ là thiết kế xấu cho người gọi để biết loại và không phải là lớp học. Vậy trường hợp sử dụng của bạn chính xác là gì? Bạn sẽ có trường hợp của lớp này mà chỉ có một subtype duy nhất trong họ? Hoặc bạn có hy vọng có một sự kết hợp của các phân nhóm và tin tưởng mã gọi để biết loại nó đang nhận ra? Thiết kế của bạn có vẻ hơi kỳ lạ vào lúc này ... – Chris

2

Trường hợp này có phù hợp với bạn không?

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

Xin chào sllev, có lẽ tôi phải suy nghĩ về điều đó. Tôi thấy rằng không có cách nào khác, có lẽ tôi nên làm điều đó như bạn đề nghị. – msedi

+0

Tại sao bạn không thể gắn bó với Get ..() phương pháp, nó là rõ ràng hơn – sll

0

Nối cho câu trả lời SLL là:

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); 
     } 
    } 
} 

Hoặc mà không thay đổi chữ ký lớp:

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); 
     } 
    } 
} 

Và tạo ra một phương pháp để phân tích cho các loại chung:

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

Tại sao bạn sử dụng 'đối tượng' trong đoạn mã thứ hai của bạn?Điều này có vẻ tồi tệ hơn trong mọi cách so với bản gốc đã sử dụng 'DataElement' ... – Chris

+0

Tôi đã sử dụng' đối tượng' để sử dụng chung –

+0

Không đủ rõ ràng. – nyedidikeke

Các vấn đề liên quan