2011-10-26 5 views
3

私はこのようなモジュールの定義があります。C#の未使用フィールドプリズムアプリケーションで

[Module(ModuleName = "TestModule", OnDemand = true)] 
public class Test : 
    ModelBase, 
    IModule 
{ 
    ... 
    moduleName = "TestModule"; 
    ... 
}; 

あなたが見ることができるように、これらのモジュールは、実行時にロードされ、それらの多くは別のモジュール名でありますが。

コードの冗長性を避けるために、私は次のようにこれらのモデルが由来する基底クラスModelBase書いた:

public class ModelBase: 
{ 
    /// <summary> 
    /// The module name 
    /// </summary>   
    protected string moduleName; 
    ... 
} 

文字列moduleNameのがModelBaseで使用されていないので、私は、コンパイラを入手んがこれをexcactlyと言っている警告CS0169。 私は警告を抑制したくないので、もっと良い解決策があるのだろうかと思います。

moduleNameは、第1のスニペットで見られるように、派生クラスの実際の名前で設定されます。

問題は、モジュール名が事前にわかっていないため、ModelBaseクラスに名前を割り当てることができないことです。

1は、この問題を克服するために

public class ModelBase: 
{ 
    /// <summary> 
    /// The module name 
    /// </summary>   
    protected string moduleName = ""; 
    ... 
} 

を書くことができますので、この問題は、愚かに聞こえるかもしれません。

この定期的な質問に「ベストプラクティス」があるのだろうかと思います。 System.Stringが参照型であるため、 感謝

ユルゲン

+1

非民間、非定数フィールドはIMO、コードのにおいですモデル名を与えるようになります。なぜここに(おそらく抽象的な)プロパティを使用しないのですか? – Ani

答えて

6

は、私は個人的にこの抽象プロパティになるだろう。 ModuleNameのあなたの使用が公開されるべきであるなら、あなたはもちろん、プロパティを公開することもできます。

同様の選択肢は、このクラスのコンストラクタのパラメータにするために、次のようになります。

protected ModelBase(string name) 
{ 
    this.moduleName = name; 
} 

これは、再び、これはコンストラクタの一環として、各派生クラスで処理されるように強制します。

+0

それは私の最初の推測でした。 – Ucodia

+0

優秀、このヒントのおかげで多くの! – Juergen

1

はさて、あなたは、コンストラクタやメンバ変数の定義の一部としてnullにmoduleNameの初期化を検討することができます。

2

ModuleBaseクラスが起動可能であると仮定すると、それらのクラス内に文字列が存在する場合、それらのクラスに名前が割り当てられている必要があります。

インスタンス化されていない場合は、ModuleBaseを抽象クラスにすることを検討してください。これは、エラーの可能性を減らすべきか、それを実装する派生クラスを強制的に、余分なボーナスとして

protected abstract string ModuleName { get; } 

1

モデルベースを抽象クラスにして、モデル名を次のようなabsract readonlyプロパティとして定義します。

Protected abstract string modelname { get; } 

これは、派生クラスが