1

MVC では次のように言えます。

Html.TextBoxFor(m => m.FirstName)

これは、モデル プロパティを (値ではなく) パラメーターとして渡すことを意味するため、MVC はメタデータなどを取得できます。

私は C# WinForms プロジェクトで同様のことをしようとしていますが、その方法がわかりません。基本的に、ユーザー コントロールに bool プロパティのセットがあり、簡単にアクセスできるようにそれらを辞書に列挙したいと思います。

public bool ShowView { get; set; }
public bool ShowEdit { get; set; }
public bool ShowAdd { get; set; }
public bool ShowDelete { get; set; }
public bool ShowCancel { get; set; }
public bool ShowArchive { get; set; }
public bool ShowPrint { get; set; }

どういうわけか、Enum Actions をキーとして、プロパティを値として Dictionary オブジェクトを定義したいと思います。

public Dictionary<Actions, ***Lambda magic***> ShowActionProperties = new Dictionary<Actions,***Lambda magic***> () {
    { Actions.View, () => this.ShowView }
    { Actions.Edit, () => this.ShowEdit }
    { Actions.Add, () => this.ShowAdd}
    { Actions.Delete, () => this.ShowDelete }
    { Actions.Archive, () => this.ShowArchive }
    { Actions.Cancel, () => this.ShowCancel }
    { Actions.Print, () => this.ShowPrint }
}

実行時に変更される可能性があるため、プロパティ値ではなくプロパティを辞書に渡す必要があります。

アイデア?

-ブレンダン

4

2 に答える 2

3

すべての例には入力パラメーターがなく、ブール値が返されるため、次を使用できます。

Dictionary<Actions, Func<bool>>

次に、ラムダを評価して、プロパティの実行時の値を取得できます。

Func<bool> fn = ShowActionProperties[ Actions.View ];
bool show = fn();
于 2013-01-02T00:17:58.380 に答える
2

式ツリーについて聞いたことがありますか? Charlie Calvert の Expression Tree の紹介

文字列プロパティへの参照を受け取るメソッドを定義するとします。これを行う1つの方法は、メソッドを持つことです:

public string TakeAProperty(Expression<Func<string>> stringReturningExpression)
{
    Func<string> func = stringReturningExpression.Compile();
    return func();
}

次に、次の方法で呼び出すことができます。

void Main()
{
    var foo = new Foo() { StringProperty = "Hello!" };
    Console.WriteLine(TakeAProperty(() => foo.StringProperty));
}

public class Foo
{
    public string StringProperty {get; set;}
}

ただし、式ツリーを使用すると、これ以上の FAR FAR を実行できます。そこで調査を行うことを心からお勧めします。:)

編集:別の例

public Func<Foo,string> FetchAProperty(Expression<Func<Foo,string>> expression)
{
    // of course, this is the simplest use case possible
    return expression.Compile();
}

void Main()
{
    var foo = new Foo() { StringProperty = "Hello!" };
    Func<Foo,string> fetcher = FetchAProperty(f => f.StringProperty);
    Console.WriteLine(fetcher(foo));
}

その他の参照リンク:

式ツリーとラムダ分解

式ツリーに関する CodeProject チュートリアル

API での式ツリーの使用

Expression Tree の驚くべき Bart de Smet

于 2013-01-02T00:19:05.230 に答える