5

「設定」クラスがあります。これには、使いやすさと set アクセサーを制限するためのプロパティがあります。10個以内なら簡単そうに見えたが、数が増えた。これらのプロパティを自動的に作成するには、次のような方法が必要です。

foreach(var property in SettingsList)
{
    _settings.AddAutoProperty(property);
}

リフレクションに対処している可能性がありますが、効率的な解決策にたどり着けません。

プロパティ定義:

public bool cbNextExcCount
{
    get { return (bool)this.GetValueById("cbNextExcCount"); }
}

public bool cbSaveOnChangeExc
{
    get { return (bool)this.GetValueById("cbSaveOnChangeExc"); }
}

public bool cbAutoIncrement
{
    get { return (bool)this.GetValueById("cbAutoIncrement"); }
}

public bool cbRememberOnExit
{
    get { return (bool)this.GetValueById("cbRememberOnExit"); }
}

...etc.

UPDATE 要約すると、次のコードを書きました:

public IDictionary<string, object> Properties = new ExpandoObject();
private List<string> SettingsList = new List<string> 
{ 
    "cbNextExcCount",
    "cbSaveOnChangeExc",
    "cbAutoIncrement",
    "cbRememberOnExit"
};

public void CreateProperties()
{
    foreach (string SettingName in SettingsList)
    {
        Properties.Add(SettingName, () => this.GetValueById(SettingName));
    }
}

しかし、私はエラーがあります() => this.GetValueById("cbNextExcCount")):

引数の型 'ラムダ式' は、パラメーターの型 'オブジェクト' に代入できません。

を保存できFunc<bool>ますが、設定には bool 以外の型が含まれる場合があり、Func を使用すると、呼び出しが少し複雑になります。

4

2 に答える 2

8

自動プロパティを作成することはできませんが、ExpandoObject.

expandos を使用するということは、ダック タイピング(つまり、動的プログラミング) を使用することを意味するためです。

ExpandoObjectサンプル:

dynamic expando = new ExpandoObject();
expando.PropertyA = "Hello";
expando.PropertyB = "world!";

expando の興味深い点は、 をExpandoObject実装IDictionary<string, object>していることです。つまり、任意の expando をこの型にアップキャストし、追加されたプロパティを反復処理できます。これは、実行時に作成された設定を保存するのに最適です。

アップデート

私は良い解決策についてもっと考えていSettingListました.自分で開発したカスタムクラスであれば、と呼ばれるプロパティを追加して、Custom設計SettingList時に追加されない設定を追加することができます.

更新 2

あなたの場合、何かの実際の値を保存する代わりに、のランタイム設定Func<bool>に追加できます。ExpandoObject

IDictionary<string, object> settings = new ExpandoObject();
settings.Add("cbNextExcCount", () => this.GetValueById("cbNextExcCount"));

this実際、コードサンプルのスコープはわかりませんthisが、インスタンスなどに変更できますSettingList

ランタイム設定を追加したら、次のようにsettings変数をdynamic入力してプロパティにアクセスできます。

dynamic allSettings = (dynamic)settings;
bool cbNextExcCount = allSettings.cbNextExcCount();
于 2012-11-06T09:42:23.627 に答える
1

System.Dynamic 名前空間の Expando オブジェクトを考慮することができます。この記事は良い出発点になる可能性があります。

于 2012-11-06T09:43:09.797 に答える