2013-07-24 7 views
6

を使用した:私は、後で使用するためpropertyにジェネリッククラスのインスタンスを維持しようとしているが、あなたが知っているよう次のコードを考えてみましょう動的な型の代わりに、いずれも、可能な汎用的な性質

public dynamic DataGrid { get; private set; } 
    public DataGridForm<TData, TGrid> GridConfig<TData, TGrid>() where TData : class 
    { 
     return DataGrid = new DataGridForm<TData, TGrid>(); 
    } 

を:

プロパティ、イベント、コンストラクタなどは汎用ではありません - 専用のメソッド とタイプは汎用である可能性があります。問題ではないほとんどの時間、私は時々それが苦痛だということに同意 (Jon Skeet

私が知りたい

がこのような状況を丸めるための良い方法ですか?

+0

共通の機能をインターフェイス 'IDataGridForm'に入れて、そのタイプのプロパティを持つことはできませんか? – Corak

+0

私はあなたを得ることができません、詳細を説明できますか? – saber

+2

さて、 'DataGridForm'をどうやって*使用したいですか?例えば、私はあなたがフォームを '表示する 'と思っています。したがって、メソッド 'Display()'を使ってインタフェース 'IDataGridForm'を作成してください。今度はあなたのクラス 'DataGridForm がそのインターフェースを実装するようにしましょう。これを行うには 'Display()'メソッドが必要です。今度はプロパティ 'public IDataGridForm DataGrid {get;プライベートセット; } '。このプロパティは 'DataGridForm を含むことができ、必要に応じてどこでも' Display() 'できます。 – Corak

答えて

1

コメントで答えが示されているように、あなたは、基本クラスまたはインタフェースでこれを行うことができます:C#で

class DataGridForm {} 
class DataGridForm<TData, TGrid> : DataGridForm {} 

class GridConfigurator 
{ 
    public DataGridForm DataGrid { get; private set; } 
    public DataGridForm<TData, TGrid> GridConfig<TData, TGrid>() where TData : class 
    { 
     return DataGrid = new DataGridForm<TData, TGrid>(); 
    } 
} 

タイプとインターフェイスのトンは、ジェネリック医薬品が追加されました。この方法を拡張しました。しかし、私はおそらくGridConfig()がDataGridFormをキャッシングしていたものが型を知っているので、おそらくあなたのデザインを再評価するでしょう。例として、私は私のコードに非常によく似たことを行う:

class Vector<T> { ... } 
static class Vector 
{ 
    public static Vector<T> Create<T>(T value) 
    { 
     return new Vector<T>(value); 
    } 
} 

class OtherClass 
{ 
    public static Vector<int> MyVector = Vector.Create(1); 
} 

あなたの特定のユースケースは、しかし、このスタイルをサポートしていないかもしれません。

+0

私の要件に合わないと説明したことがわかりました。 'DataGridForm 'を返す 'DataGridForm'にメソッドを持たせることです。このような状況では、ベース型もジェネリック型にする必要があります。私は正しい? – saber

+0

これはメソッドではありませんが、プロパティの場合はyesです。私の2番目の例では、Vector は問題なくVectorから継承できます。 – lukegravitt

+0

Vector.Createの戻り値の型はVector ではありませんか? – marcob

0

この場合、タイプ自体は汎用でなければなりません。

class GridConfigurator<TData, TGrid> 
     where TData : class 
    { 
     public DataGridForm<TData, TGrid> DataGrid { get; private set; } 
     public DataGridForm<TData, TGrid> GridConfig<TData, TGrid>() 
     { 
      return DataGrid = new DataGridForm<TData, TGrid>(); 
     } 
    } 

しかし、私はこのクラスの目的を理解していません。 GridConfigメソッドには、プライベートセッターを持つDataGridプロパティを設定することの明らかな副作用があります。このクラスを使用していた場合、GridConfig()が返す値がDataGridプロパティとして設定されていることは決してありません。言い換えれば:

object.ReferenceEquals(firstGrid, secondGrid); 

しかし、私は、これはを返すと仮定します:

var configurator = new GridConfigurator(); 
var firstGrid = configurator.GridConfig(); 
var firstReference = configurator.DataGrid; 
var secondGrid = configurator.GridConfig(); 
var secondReference = configurator.DataGrid; 

私は次のようにfalseを返します引き受ける

object.ReferenceEquals(firstReference, secondReference); 

ためにはポイントで上記のコードはDataGridプロパティを割り当てることができます。 GridConfig()というメソッドがその効果を持つことは明らかではありません。

囲みタイプ(GridConfigurator)も一般的にすることは、あなたが試みているものの目的を破るようです。代わりにDataGridFormの直接参照を代わりに使うことができる人は誰でしょうか?

GridConfig方法は、ちょうどDataGridFormの新しい既定のインスタンスを割り当てるよりも、もっと何かを行うことになっている場合は、それこのような静的なファクトリクラスます

static class GridConfigurator 
{ 
    public static DataGridForm<TData,TGrid> GridConfig<TData, TGrid>(...) where TData: class 
    { 
    var grid = new DataGridForm<TData,TGrid>(); 
    // do something with the parameters to this method to initialize the instance. 
    return grid; 
    } 
} 

私も以外の方法何かに名前を付けますGridConfig。 Configure()やCreate()と同様です。

関連する問題