2011-01-28 7 views
0

私はこの質問の変形を見ましたが、まだ回答が見つかりませんでした。不明なタイプの実行時にカスタムクラスをインスタンシエート

私はカスタムクラスがあります。

public class Indicator 
{ 
    public double Value { get; set;} 

    virtual public void Calc(val1, val2) {} 
} 

をそして、私のようなそれから派生多くのクラス、持っている:

class calc_sum : Indicator 
{  
    override public void Calc(val1, val2) 
    { 
    Value=val1+val2; 
    } 
} 

最後に、私はすべての「インジケータ」を保持するクラスを持っている:

class IndicatorCollection 
{ 
    List<Indicator> _collection = new List<Indicator>(); 

    ...Some other methods here... 
} 

私が必要とするのは、 "IndicatorCollection"クラスのメソッドを提供することです。 "Indicator"から派生したクラスの名前を_collectionに追加します。 すなわち:ユーザが実行時にインジケータを追加することができ

IndicatorCollection.AddIndicator("calc_sum"); 

その方法(IndicatorsCollection各部材のValueプロパティを表示リストにバインドされています)。

私は十分に明確であり、正しいアプローチを取っていることを希望します。 アクチベーター方法は、私が探していたまさにです、だから私はそれがより困難にしてみましょう::インジケータインスタンスを追加した後

、IndicatorCollectionは新しいを公開することができ はすべて

更新ありがとうクラスのValueプロパティへのショートカットであるプロパティ。

すなわち:

// After adding calc_sum to the collection, The IndicatorCollection class will have the following //property: 
public double calc_sum 
{ 
    get { return _collection.Find(i=>i.name=="calc_sym").First().Value; 
    // The indicator class also has a public member of "name" 
} 
+0

あなたのコードはコンパイルされません。 – Oded

+0

私は上記の例に基づいて 'Indicator'と' Calc'メソッドを抽象化したいと思います。 –

+0

私はあなたの新しい要件が満たされるとは思わない。 C#を使用して、既存の型にそのプロパティを追加することはできません。 –

答えて

3

Indicatorクラスとその子孫が、公開パラメータなしのコンストラクタを公開する場合は、使用することができますActivator.CreateInstance()は、実行時に動的にその名前のクラスをインスタンス化する。(あなたの更新後)は、第2の要件について

public class IndicatorCollection 
{ 
    public void AddIndicator(string className) 
    { 
     _collection.Add((Indicator) 
      Activator.CreateInstance(null, className).Unwrap()); 
    } 

    private List<Indicator> _collection = new List<Indicator>(); 
} 
0

あなたは、クラス名に基づいてオブジェクトをインスタンス化するアクティベータクラスを使用することができます。 calc_sumインジケータはbinディレクトリ(またはその他のプロービングパス)でアセンブリに存在する、あなたはそれのインスタンスを取得することができますと仮定:

var myIndicator = Activator.CreateInstance(Type.GetType("calc_sum")) as Indicator; 
0

、なぜ名前を格納する代わりにList<indicator>Dictionary<string, Inidicator>を使わないのでしょうか?おそらく、あなたはあなたの要求を複雑にしているでしょう。 `` virtual` override`とキーワードが修飾リストの最初にすることはできませんよう

public class IndicatorCollection 
{ 
    var _dictionary = new Dictrionary<string, Indicator>(); 

    public void AddIndicator(string className) 
    { 
     _dictionary.Add(
      className, 
      (Indicator)Activator.CreateInstance(null, className).Unwrap() 
     ); 
    } 
} 

、その後...

public double GetValue(string indicatorName) 
{ 
    return _dictionary[indicatorName].Value; 
} 
+0

私はこれをプロパティにしたいのです:現在、リストはItemsCollectionにバインドされています。代わりに、それを個々の項目にバインドする必要があります。{Binding IndicatorCollectionInstance.calc_sum} – Sol

関連する問題