2017-02-09 34 views
0

私は間違って質問したことがあるかもしれませんが、ここに私に付いているかもしれません。継承クラスの同じ名前の異なるプロパティを設定する方法

私はルールのカップルを持っているConfiguration Managerを作っています。..すべてKeysは文字列ですが、Valuestringintdoubleまたはbool(しかし、0,1の整数として示されている)のいずれかになります

私は」私はクラスといくつかの一般的なものを書いてまた、ToString();メソッドをオーバープリントして素敵な印刷パターンを取得し、ラッパークラスでオブジェクトを取得するためにオペレータオーバーライドを作成しました。今私は、そのオブジェクトのセッターを作成しようとしていますが、値の型が一致していないので、私はいくつかの深刻な問題を抱えている。..

public class Config() 
{ 
    public List<ConfigEntry> ConfigLines {get;set;} 

    public ConfigEntry this[string key] 
    { 
     get 
     { 
      if(CfgConfig.Any(x => x.GetKey(true) == key)) 
      { 
       return CfgConfig.Where(x => x.GetKey(true) == key).Single(); 
      } 
      if (ProfileConfig.Any(x => x.GetKey(true) == key)) 
      { 
       return ProfileConfig.Where(x => x.GetKey(true) == key).Single(); 
      } 

      return null; 
     } 
     set 
     { 
      //?????????????? 
     } 
    } 

    public class ConfigEntry() 
    { 
     public string CommonStuff {get;set); 

     public virtual string GetKey(bool tolower = false) 
     { 
      return null; 
     } 

     public override string ToString() 
     { 
      return CommonStuff; 
     } 

     public class TextValue : ConfigEntry 
     { 
      public string Key {get;set;} 
      public string Value {get;set;} 

      public override string ToString() 
      { 
      return [email protected]"{Key}={Value};"; 
      } 

      public virtual string GetKey(bool tolower = false) 
      { 
       if (tolower) 
        return Key.ToLower(); 
       else 
        return Key; 
      } 
     } 

     public class IntValue : ConfigEntry 
     { 
      public string Key {get;set;} 
      public int Value {get;set;} 

      public override string ToString() 
      { 
       return [email protected]"{Key}={Value};"; 
      } 

      public virtual string GetKey(bool tolower = false) 
      { 
       if (tolower) 
        return Key.ToLower(); 
       else 
        return Key; 
      } 
     } 
    } 
} 

は今どのように私は、[オペレータのセッターを設定することができ]これが実際に正常に動作するためには、私がタイプすると、ConfigLines["anintkey"] = 5;ConfigLines["astringkey"] = "Hello";と言うことができます。私は<T> classをどこかで使う必要があると思いますが、テンプレートをあまり使用していませんこれを取り除く方法を見つけ出すことはできません。 元のリストをベースクラスとして保持し、それから作業したいと思いますが、私はこれをどのように取り除くのか手がかりがありません。

ありがとうございました!

答えて

1

ConfigEntry<T>を作成できますが、List<ConfigEntry<T>>を含むConfig<T>を作成する必要があります。それは解決策ではありません。

必要なのはただdynamicです:

var conf = new Dictionary<string, dynamic>(); 
conf["url"] = "http://example.com"; 
conf["timeout"] = 30; 
// in some other place 
string url = conf["url"]; 
int timeout = conf["timeout"]; 
+0

私はアプリの私の古いバージョンで辞書を使用しますが、私は今、より堅牢なソリューションのために行くよ...動的な値は、実際に問題を修正すること、Iこの仕事のようなセッターを確認するだけです – DethoRhyne

+0

最も堅牢なソリューションは、必要なすべてのオプションでConfigクラスを作成することです。動的なものを使いたくない場合は、 'conf [" url "] =" http://example.com "; conf [" timeout "] = 30;' – Anton

+0

これはあなたと同じように動作します私の状況には完璧だったと言いました。ありがとうございました! :)私は辞書を作っていないことを除いて、それを複数の継承クラスのオブジェクトとして残し、単純にValueプロパティを動的型にしました – DethoRhyne

関連する問題