は私がコンストラクタパラメータを示す式を記述する方法はありますか?
Expression<Func<Foo, string>> member = foo => foo.Bar;
を書いて、メンバーBar
を指す表現を得ることができ、次のタイプ
class Foo
{
public string Bar { get; private set; }
public Foo(string bar)
{
Bar = bar;
}
}
を考えます。
コンストラクタパラメータbar
を指す式を何とか書くことができますか?
これで私の目標は変更することが弾力性のある方法で、コンストラクタのパラメータを示すことができるようにすることです。たとえば、コンストラクタをリファクタリングするときに、パラメータの名前を変更することができます。これは式に引き継がれます。私はそれを削除した場合、式はビルドエラーを起こす必要がある、など
アップデート - 私は有効にしたいの使用の更なる明確化:
(拡張メソッドを考えてみて、本当に問題ではありません
public static void DoSomething<T>(this object o, Expression<Func<T, object>> expr)
{
// ...
}
:それは次のように定義されていた場合
new object().DoSomething<Foo>(foo => foo.Bar);
:このように呼んだもの)に210
プロパティBar
にアクセスして、拡張メソッドの本体の内部でさまざまなことを行うことができます。たとえば、他の場所からの入力を受けて、その値を設定することができます。具体的なユースケースは、このような何かをしAutoMapper、次のとおりです。
CreateMap<FooDto, Foo>()
.ForMember(dest => dest.Bar, cfg => cfg.MapFrom(src => src.BarSrc));
表現dest => dest.Bar
は、我々は上の特別な設定を適用すること(Foo
上)の特性を示し、src => src.BarSrc
は(FooDto
上の)プロパティを示していると我々価値を取りたい。実際にFooDto
をFoo
にマップするとき、AutoMapperはソースインスタンスからBarSrc
の値を抽出し、宛先インスタンスのBar
を2つの式を使用してその値に設定することができます。
同様に、私はあなたの正確な程度完全かどうか分からない
CreateMap<FooDto, Foo>()
.ForCtorParam(dest => /* what do I put here to indicate the bar ctor param? */,
cfg => cfg.MapFrom(src => src.BarSrc));
(現在のAPIは私に不格好感じる.ForCtorParam("bar", ...)
です。)
あなたはC#6を指していると思っています。その場合は、あなたの投稿を編集してそれを反映させるべきです。 – Rahul
@Rahulこの記事のC#6はなんですか? – juharr
@Rahul:C#バージョンについてはあまり気にしませんが、C#6が問題を解決する必要があるかもしれません。しかし、これは本質的な問題ではありません。以前のバージョンのソリューションも大歓迎です。 –