MemberAcess 式を 1 よりも深いレベルに (再帰的に) 動的に作成したいと思います。
public class Job
{
public string Name { get; set; }
public int Salary { get; set; }
}
public class Employee
{
public string Name { get; set; }
public Job Job { get; set; }
}
そして、従業員の各プロパティと従業員の複雑なメンバーの各プロパティの MemberAccesExpressions のリストを動的に作成したい場合、結果は次のようになります。
MemberAccesExpression[] {
{ e => e.Name },
{ e => e.Job.Name },
{ e => e.Job.Name }
}
これは私が得たものの擬似コードです:
List list = new List();
public Expression<Func<TModel, dynamic>> CreateME<TModel>(TModel model)
{
var type = typeof (TModel);
var properties = type.GetProperties();
foreach (var prop in properties)
{
// I want to ignore collections
if (typeof(ICollection).IsAssignableFrom(prop.PropertyType)) continue;
// Recall for complex property
if (prop.PropertyType.Namespace != "System")
{
// CreateME(model, ) // THIS IS WHEN I DON'T KNOW WHAT TO DO
continue;
}
var param = Expression.Parameter(type, "x");
var memberAccess = Expression.PropertyOrField(param, prop.Name);
list.Add(Expression.Lambda<Func<TModel, dynamic>>(memberAccess, param));
}
}
これを再帰的な方法にするにはどうすればよいですか? (TModel モデル、Expression> baseMemberAccess = null) という名前のオプションのパラメーターを追加し、メンバー式が null でない場合は何らかの方法で baseMemberAccess に連結することを考えました。
PSは、タイプがアトミックタイプではないかどうかを判断するより良い方法がありますか? (int、float、string などではありません...)
どんな助けにも感謝します、アダム
より簡単に配置しようとするための編集:
Employee.Name へのメンバー アクセスの式ツリーを作成する場合は、次のようにします。
var param = Expression.Parameter(type, "x");
var memberAccess = Expression.PropertyOrField(param, memberName);
return Expression.Lambda<Func<TModel, TMember>>(memberAccess, param);
Employee.Job.Salary へのメンバー アクセスに相当するものは何ですか?