[C#] How to Get property name from object

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

Update 2019-05-23

จากแบบที่สอง เราสามารถใช้ nameof ได้เลยครับ ตัวอย่าง ตามนี้เลย แถม Code สั้นกระชับด้วย

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

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

สำหรับถ้าใครอยากอ่าน Step การ Research ของผม ตามนี้เลยครับ

แบบที่ 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 ที่ทิ้งห่างไปนานพอสมควร หลังจากที่เริ่มเรียน ป โท ครับ

 


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.