2011-08-12 10 views
7

私はすべてDataElementから派生したオブジェクトのセットを含むDICOM辞書を持っています。 辞書はキーとしてintを持ち、プロパティとしてDataElementを持っています。 私のDICOMの辞書が含まれている私はこのように、定義するDataElementにアクセスすることができ、この[]プロパティ:今汎用[this]プロパティを持つことはできますか?

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

問題は、私は別の定義するDataElementタイプがすべてのようにDataElementSQ、DataElementOBと同様に、定義するDataElementから派生しているということです。私が今したいことは、C#で書くのが少し簡単になるようにするためです:

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

これは実際には不可能です。私が見逃したことはありますか?もちろん、私はゲッターメソッドでそれを行うことができますが、それをこのようにする方がはるかに良いでしょう。

+1

一般的なプロパティ(インデクサを含む) http://stackoverflow.com/questions/494827/why-it-is-not-posible-to-define-generic-indexers-in-net –

+0

あなたが信じているかどうかに関係なく、あなたがしていることは混乱しますイモを使い、読む。 – Marc

答えて

3

代わりに実際の汎用メソッドGetDataElement<T> where T : DataElementを使用してみませんか?一般的なインデクサはC#ではサポートされていません。なぜこの場合、インデクサーは方法よりも優れていると思いますか?

+0

こんにちはダニー、これは私が期待したものです。ゲッターメソッドを持つ問題は、実際には内部的に私はそのようなメソッドを持っているので、コードをはるかに読みにくくしてから、このショートハンドメソッドとして持つことです。もちろん、それをキャストしなければならない場合、これもそうではありません。これが私がそのようなことを探していた理由です。現在私はそれと一緒に暮らすことができますが、この質問は私の心に入ってきました。 – msedi

4

最良の選択肢は、インデクサーの代わりにジェネリックメソッドを使用するか、クラスをジェネリックにすることです(この場合、インデクサーはジェネリックタイプのクラスに関連付けられます)。あなたが記述したような一般的なインデクサは、C#では使用できません。

+0

こんにちはReed、あなたは私がジェネリッククラスを作成することができますが、現在はジェネリッククラスなしで動作しているので、私は何かをしないようにしていました。 – msedi

+0

@msedi:あなたが見せていることを考えれば、辞書には複数の型が含まれている可能性があります。現在のコードで型の安全性を保証する方法はありません。つまり、C#の仕様はサポートしていません。 –

+0

@msedi:クラスそのものがインデクサーがどのタイプを返すべきかわからない場合はどうなりますか?呼び出し側がクラスではなく型を知っているのは、悪い設計です。では、ユースケースはどういうものですか?このクラスのインスタンスに単一のサブタイプしか持たないインスタンスを持っていますか?あるいは、サブタイプを混ぜて呼び出しコードを信用して、その型を知りたいと思っていましたか?あなたのデザインは現時点ではちょっと変わったようです... – Chris

2

あなたのケースですか? SLL答えを

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

こんにちは、私はそれについて考える必要があります。私は他の方法がないことを知っている、多分私はあなたが提案したようにそれを行う必要があります。 – msedi

+0

なぜGet ..()メソッドを使うことができないのですか?もっと明確です – sll

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

2番目のコードスニペットで 'object'を使用しているのはなぜですか?これは、 'DataElement'を使用した元のものよりもあらゆる面で悪いようです... – Chris

+0

ジェネリック使用のために' object'を使用しました –

+0

十分明確ではありません。 – nyedidikeke

関連する問題