2017-05-10 10 views
0

私は、C#の内部にデータの集合を構築するタスクを持っています。異なるタイプのネストされた辞書

各データセットは、これらの属性があります。

  • タイプ
  • 名(ShortDescription)
  • ServiceString
  • HTTPMETHOD

属性の "タイプ" と "名前" を持ちます既知の固定値のセット。

例データ:

Type: User 
    -> Name: Get_Users_List 
    -> Name: Add_User 
    -> Name: Enable_User 
    -> Name: Disable_User 
Type: Rights 
    -> Name: Get_Rights_List 
    -> Name: Approve_User_Right 

...というように。

コーディングエラーを最小限に抑えるため、エントリのリストがわかっていて固定されているため、「タイプ」と「名前」にいくつかの列挙型を作成しました。

例データ:

enumTypes 
enumUserFunctions 
enumRightFunctions 

...というように。

私はまた、データは、コード内でアクセスされるべき方法を知っている:

SomeCollection[enumType.User][enumUserFunctions.Add_User].ServiceString 
SomeCollection[enumType.User][enumRightFunctions.Approve_User_Right].HTTPMethod 

私は、この目標を達成するために、ネストされた辞書を使用しようとしているが、私は、ネストされた辞書が異なるを持っていることを問題に直面してタイプしようとしているデータセットタイプに応じてタイプします。

Dictionary<enumTypes, Dictionary<variableEnum, AutoPropertyWithValues>> 

私はどのようにして目標を快適に達成できますか?


編集

根本的な原因は、私は私のコードで複数回使用する必要があるいくつかのオブジェクトを持っている、と私は彼らにナビゲートする直感的な方法を実装したいということです。これは私がSinatrの提案の後、私の根本的な考えから作ったものです。

public class FunctionCollection 
{ 
    public UserFunctions UserFunctions { get; } = new UserFunctions(); 
    public BaseDataFunctions BaseDataFunctions { get; } = new BaseDataFunctions(); 
    /* ... and so on ... */ 
} 
public class UserFunctions 
{ 
    public RestFunction Do_User_Login { get; set; } = new RestFunction(); 
    public RestFunction Do_User_Logout { get; set; } = new RestFunction(); 
    /* ... */ 
} 
public class BaseDataFunctions 
{ 
    public RestFunction Get_Product_List { get; set; } = new RestFunction(); 
    /* ... */ 
} 
public class RestFunction 
{ 
    public string ServiceUriString { get; set; } 
    public HttpVerbs Method { get; set; } 
    /* ... and so on ... */ 
} 

ちょうど最後の質問です。 定義にオブジェクトを直接設定する方法はありますか? Do_User_Loginの定義における例設定ServiceUriStringについて とHTTPMETHOD:

public RestFunction Do_User_Login { get; set; } = new RestFunction(); 
+1

辞書を入れ子にすることはできますが、代わりに 'User'と' Rights'クラスを使う方がきれいです。 – Abion47

+1

設定を保持するのに 'Dictionary'を使う考えが全くありません。 'AutoPropertyWithValue'とは何ですか?答えは実際に値で何をしているのか(辞書がいっぱいになって使用されているかどうか)によって決まります。 – Sinatr

+0

ルートの問題は何ですか?設定ファイル(JSON)から値を取得するのが嫌ですか? –

答えて

1

エントリのリストが知られており、固定され

(等DictionaryList、)そのような動的な構造を使用しないでください。

public class Configuration 
{ 
    public User UserA { get; set; } = new User(); 
    public User UserB { get; set; } = new User(); 
    ... 
} 

public class User 
{ 
    public string ServiceString { get; set; } = "whatever"; 
} 

が使用

var serviceString = configurationInstance.UserA.ServiceString; 

あなたがそれらを列挙する必要がある場合、あなたはリフレクションを使用するか、または類似の方法を追加することができ、次のいずれかむしろ標準プロパティは、あなたはタイプを識別に追加の列挙を必要としません

public IEnumerable<User> GetUsers() 
{ 
    yield return UserA; 
    yield return UserB; 
} 
+0

あなたの提案をありがとう、私は新人ですし、このようにクラスを使用したり、見たことはありません。あなたの例では、ユーザーの定義に "ServiceString"の値を設定する方法はありますか? Become "ServiceString"フォームUserAはUserBとは異なる;)P.S.私はこれまでの進捗状況を追加するために私の最初の質問を編集しました。 – kami

+1

* ""サービスストリング "値をユーザーの定義に設定する" * - パラメーターを持つコンストラクターまたは[オブジェクトイニシャライザー]を使用できます(https://docs.microsoft.com/en-us/dotnet/articles/csharp /プログラミングガイド/クラスと構造体/オブジェクトとコレクションの初期化子)、例えば'新しいUser(){ServiceString ="何か "}'。 – Sinatr

+0

ありがとうございました。私が必要としていたものであり、当初よりも複雑ではありませんでした;) – kami

0

にあなたは

によってこれを簡素化することができます
public class MyConfig 
{ 
    private readonly Dictionary<string, Dictionary<string, RestFunction>> _config = new Dictionary<string, Dictionary<string, RestFunction>> 
    { 
     [nameof(User)] = new Dictionary<string, RestFunction> 
     { 
      [nameof(UserSection.Add_User)] = new RestFunction { HttpMethod = "GET", ServiceString = "foo" }, 
      [nameof(UserSection.Get_Users_List)] = new RestFunction { HttpMethod = "GET", ServiceString = "foo" }, 
     }, 
     [nameof(Rights)] = new Dictionary<string, RestFunction> 
     { 
      [nameof(RightsSection.Approve_User_Rights)] = new RestFunction { HttpMethod = "GET", ServiceString = "foo" }, 
      [nameof(RightsSection.Get_Rights_List)] = new RestFunction { HttpMethod = "GET", ServiceString = "foo" }, 
     }, 
    }; 

    protected IDictionary<string, RestFunction> GetSectionValues([CallerMemberName] string propertyName = null) 
    { 
     return _config[propertyName]; 
    } 

    public UserSection User => new UserSection(GetSectionValues()); 
    public RightsSection Rights => new RightsSection(GetSectionValues()); 
} 

public class RestFunction 
{ 
    public string HttpMethod { get; set; } 
    public string ServiceString { get; set; } 
} 

public abstract class ConfigSectionBase 
{ 
    protected readonly IDictionary<string, RestFunction> _values; 
    protected ConfigSectionBase(IDictionary<string, RestFunction> values) 
    { 
     _values = values; 
    } 

    protected RestFunction GetProperty([CallerMemberName] string propertyName = null) 
    { 
     return _values[propertyName]; 
    } 
} 

public class UserSection : ConfigSectionBase 
{ 
    public UserSection(IDictionary<string, RestFunction> values) : base(values) 
    { 
    } 

    public RestFunction Add_User => GetProperty(); 
    public RestFunction Get_Users_List => GetProperty(); 
} 

public class RightsSection : ConfigSectionBase 
{ 
    public RightsSection(IDictionary<string, RestFunction> values) : base(values) 
    { 
    } 

    public RestFunction Approve_User_Rights => GetProperty(); 
    public RestFunction Get_Rights_List => GetProperty(); 

} 
+0

私の必要性はSinatrのソリューションが私の必要性に合っていると思いますが、あなたの提案に感謝します。 – kami

関連する問題