با تشکر از شما. حالت پیشرفتهتر این مساله، کار با مدلهای تو در تو هست. برای مثال:
public class CompanyModel
{
public int Id { get; set; }
public string CompanyName { get; set; }
public string CompanyAbbr { get; set; }
public Product Product { set; get; }
}
public class Product
{
public int Id { set; get; }
}
در اینجا اگر بخواهیم Product.Id را بررسی کنیم:
var data = PropertyExtensions.PropertyName<CompanyModel>(x => x.Product.Id);
فقط Id آن دریافت میشود.
راه حلی که از کدهای EF برای این مساله استخراج شده به صورت زیر است (نمونهاش متد Include تو در تو بر روی چند خاصیت):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
namespace PropertyExtensionsApp
{
public class PropertyHelper : ExpressionVisitor
{
private Stack<string> _stack;
public string GetNestedPropertyPath(Expression expression)
{
_stack = new Stack<string>();
Visit(expression);
return _stack.Aggregate((s1, s2) => s1 + "." + s2);
}
protected override Expression VisitMember(MemberExpression expression)
{
if (_stack != null)
_stack.Push(expression.Member.Name);
return base.VisitMember(expression);
}
public string GetNestedPropertyName<TEntity>(Expression<Func<TEntity, object>> expression)
{
return GetNestedPropertyPath(expression);
}
}
}
در این حالت خواهیم داشت:
var name = new PropertyHelper().GetNestedPropertyName<CompanyModel>(x => x.Product.Id);
که خروجی Product.Id را بر میگرداند.