[C#] How to Get property name from object

งานของผมใช้ Dapper แล้วปัญหามันมีอยู่ว่าตอนสร้าง predicate(เงื่อนไข) มันต้องเอาชื่อ Property ไป Where ทำให้มันมีความเสี่ยงมาก ถ้าแก้ชื่อ Property แล้ว Refactor ไม่ครบครับ ผมเลยทำ Helper มาเพื่อช่วยให้มันไป Get ชื่อ Property จากตัว Object ซะเลยครับ ได้มาเป็น

แบบที่ 1: Get Property with create an instance

//Get Property with create an instance
public static string GetPropertyName(Expression<Func> expression)
{
    MemberExpression body = (MemberExpression)expression.Body;
    return body.Member.Name;
}

ตัวอย่างการใช้งานครับ

IDictionary<String, Object> criteria = new Dictionary<String, Object>();
InterestRateDTO InterestRate = new InterestRateDTO();
criteria.Add(TypeExtensions.GetPropertyName(() => InterestRate.ActiveFlag), ACTIVE_FLAG.ACTIVE.ToString());
criteria.Add(TypeExtensions.GetPropertyName(() => InterestRate.InterestRateId), IntRateConditionList);

IList InterestRateList = _InterestRateDAO.FetchList(criteria);
IList InterestRateDetailList = _InterestRateDetailDAO.FetchList(criteria);

Trade-off

ปัญหาของแบบแรก คือ ต้องมีการ new Object ขึ้นมาครับ เสีย Cost มาแก้เป็นแบบที่สองดีกว่า

แบบที่ 2: Get Property without create an instance

//Get Property without create an instance
public static string GetPropertyName<TModel, TProperty>(Expression<Func<TModel, TProperty>> property)
{
    MemberExpression memberExpression = (MemberExpression)property.Body;
    return memberExpression.Member.Name;
}

ตัวอย่างการใช้งานครับ

IDictionary<string, object> criteria = new Dictionary<string, object>();
criteria.Add(TypeExtensions.GetPropertyName((InterestRateDTO c) => c.ActiveFlag),ACTIVE_FLAG.ACTIVE.ToString()); 
criteria.Add(TypeExtensions.GetPropertyName((InterestRateDTO c) => c.InterestRateId),IntRateConditionList);

IList InterestRateList = _InterestRateDAO.FetchList(criteria);
IList InterestRateDetailList = _InterestRateDetailDAO.FetchList(criteria);

จบไปแล้วกับ Blog ในสาย Coding ที่ทิ้งห่างไปนานพอสมควร หลังจากที่เริ่มเรียน ป โท ครับ