のみ単一のプロパティのいずれかが選択されている場合、または複数のプロパティが選択されている場合、ここで与えられた答えが働きます。どちらも両方のために働かない。answerによるLukazoidは、複数のプロパティに対してのみ機能し、残りのプロパティは、私の答えを書いているときに単一のプロパティに対してのみ機能します。
以下のコードは両方の場合を考慮しています。つまり、単一のプロパティと複数のプロパティを選択するために使用できます。ここに健全性チェックを追加していないので、ご自身で追加してください。
string[] Foo<T>(Expression<Func<Person, T>> func)
{
if (func.Body is NewExpression)
{
// expression selects multiple properties,
// OR, single property but as an anonymous object
// extract property names right from the expression itself
return (func.Body as NewExpression).Members.Select(m => m.Name).ToArray();
// Or, simply using reflection, as shown by Lukazoid
// return typeof(T).GetProperties().Select(p => p.Name).ToArray();
}
else
{
// expression selects only a single property of Person,
// and not as an anonymous object.
return new string[] { (func.Body as MemberExpression).Member.Name };
}
}
以上簡潔に、三項演算子を使用すると、それはすべてがちょうどこのようになります。
string[] Foo<T>(Expression<Func<Person, T>> func)
{
return (func.Body as NewExpression) != null
? typeof(T).GetProperties().Select(p => p.Name).ToArray()
: new string[] { (func.Body as MemberExpression).Member.Name };
}
ダウンロードLinkPadファイル:LinkPad
オンラインそれを参照してください:Repl.it
指摘してお気軽にどうぞ私が逃したかもしれないもの。
学習教材以外にも、独自のORMユーティリティを実装する特別な理由はありますか?そこには多くのORMプロバイダがあり、しばしば家庭で栽培されているものは価値があるよりも多くの面倒を引き起こす。 – Lukazoid
質問を更新しました。私は実際には、データクラスのすべてのプロパティではなく、SELECT内の指定された列をサポートするようにPetaPocoを拡張しようとしています。 – Brady