첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;

#region 객체 리스트 특정 속성 값에 따라 정렬하기 (속성 1개만 지정) - SortList<TSource>(sourceList, propertyName, sortDirection)

/// <summary>
/// 객체 리스트 특정 속성 값에 따라 정렬하기 (속성 1개만 지정)
/// </summary>
/// <typeparam name="TSource">소스 타입</typeparam>
/// <param name="sourceList">소스 리스트</param>
/// <param name="propertyName">속성명</param>
/// <param name="sortDirection">정렬 방향</param>
/// <returns>정렬 객체 리스트</returns>
public List<TSource> SortList<TSource>(List<TSource> sourceList, string propertyName, string sortDirection)
{
    int reverser = sortDirection.ToLower().StartsWith("asc") ? 1 : -1;

    Comparison<TSource> comparison = new Comparison<TSource>
    (
        delegate(TSource x, TSource y)
        {
            MethodInfo methodInfo = GetCompareToMethodInfo<TSource>(x, propertyName);

            object xValue = x.GetType().GetProperty(propertyName).GetValue(x, null);
            object yValue = y.GetType().GetProperty(propertyName).GetValue(y, null);

            object result = methodInfo.Invoke(xValue, new object[] { yValue });

            return reverser * Convert.ToInt16(result);
        }
    );

    sourceList.Sort(comparison);

    return sourceList;
}

#endregion

#region CompareTo 메소드 정보 구하기 - GetCompareToMethodInfo<T>(sourceObject, propertyName)

/// <summary>
/// CompareTo 메소드 정보 구하기
/// </summary>
/// <typeparam name="TSource">소스 타입</typeparam>
/// <param name="sourceObject">소스 객체</param>
/// <param name="propertyName">속성명</param>
/// <returns>CompareTo 메소드 정보</returns>
private MethodInfo GetCompareToMethodInfo<TSource>(TSource sourceObject, string propertyName)
{
    Type sourceType = sourceObject.GetType();

    object propertyValue = sourceType.GetProperty(propertyName).GetValue(sourceObject, null);

    Type propertyType = propertyValue.GetType();

    MethodInfo methodInfo = propertyType.GetMethod("CompareTo", new Type[] { propertyType });

    return methodInfo;
}

#endregion
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요