c# - visual studio form title




표현 나무의 실제 사용 (6)

표현식 트리는 좋은 기능이지만 실제로 사용하는 것은 무엇입니까? 그들은 어떤 종류의 코드 생성이나 메타 프로그래밍이나 그런 것들에 사용될 수 있습니까?


LINQ 공급자의 구현은 주로 식 트리를 처리하여 수행됩니다. 또한 코드를 사용하여 리터럴 문자열을 제거하는 방법도 있습니다.



데이터를 정렬하거나 필터링 할 때 동적 쿼리를 만드는 데 사용합니다. 예로서:

IQueryable<Data.Task> query = ctx.DataContext.Tasks;

if (criteria.ProjectId != Guid.Empty)
      query = query.Where(row => row.ProjectId == criteria.ProjectId);

if (criteria.Status != TaskStatus.NotSet)
      query = query.Where(row => row.Status == (int)criteria.Status);

if (criteria.DueDate.DateFrom != DateTime.MinValue)
      query = query.Where(row => row.DueDate >= criteria.DueDate.DateFrom);

if (criteria.DueDate.DateTo != DateTime.MaxValue)
     query = query.Where(row => row.DueDate <= criteria.DueDate.DateTo);

if (criteria.OpenDate.DateFrom != DateTime.MinValue)
     query = query.Where(row => row.OpenDate >= criteria.OpenDate.DateFrom);

var data = query.Select(row => TaskInfo.FetchTaskInfo(row));

방금 ExpressionTree 사용하여 generic filter function 를 만들었습니다. 여러분과 share 하고 싶습니다 ...

Start

var allFiltered= Filter(AllCustomer, "Name", "Moumit");

public static List<T> Filter<T>(this List<T> Filterable, string PropertyName, object ParameterValue)
{
    ConstantExpression c = Expression.Constant(ParameterValue);
    ParameterExpression p = Expression.Parameter(typeof(T), "xx");
    MemberExpression m = Expression.PropertyOrField(p, PropertyName);
    var Lambda = Expression.Lambda<Func<T, Boolean>>(Expression.Equal(c, m), new[] { p });
    Func<T, Boolean> func = Lambda.Compile();
    return Filterable.Where(func).ToList();
}

One More

string singlePropertyName=GetPropertyName((Property.Customer p) => p.Name);

public static string GetPropertyName<T, U>(Expression<Func<T, U>> expression)
{
        MemberExpression body = expression.Body as MemberExpression;
        // if expression is not a member expression
        if (body == null)
        {
            UnaryExpression ubody = (UnaryExpression)expression.Body;
            body = ubody.Operand as MemberExpression;
        }
        return string.Join(".", body.ToString().Split('.').Skip(1));
}

Make it more expandable

string multiCommaSeparatedPropertyNames=GetMultiplePropertyName<Property.Customer>(c => c.CustomerId, c => c.AuthorizationStatus)

public static string GetMultiplePropertyName<T>(params Expression<Func<T, object>>[] expressions)
{
        string[] propertyNames = new string[expressions.Count()];
        for (int i = 0; i < propertyNames.Length; i++)
        {
            propertyNames[i] = GetPropertyName(expressions[i]);
        }

        return propertyNames.Join();
}

....... 나는 Reflection 사용해서도 할 수 있다는 것을 알고있다. 그러나 이것은 엄청나게 빠르다. 또는 나는 첫번째 컴파일 후에 Lambda 와 동등하다고 말할 수있다. 아주 첫 번째 반복은 단지 평균 10 밀리 초이다. 이것은 Expression Tree 마법입니다. 간단하고 환상적인 .... 나는 생각한다 ... !!!!!!!!


표현식 트리를 사용하여 수학 표현식 평가기를 작성하는 방법 : 표현식 트리를 사용하여 C #


Jon은 .NET 3.5를 사용하여 일반 연산자 를 제공합니다. 또한 (MiscUtil에서) 기본이 아닌 생성자에 대한 빠른 액세스를 제공하기 위해 이들을 사용합니다 (생성자와 함께 Delegate.CreateDelegate 를 사용할 수는 없지만 Expression 은 정상적으로 작동합니다).

수동으로 생성 된 표현식 트리의 다른 용도 :

그러나 실제로 Expression은 동적 코드를 작성하는 매우 다양한 방법입니다. Reflection.Emit 보다 훨씬 간단하고 돈으로는 CodeDOM보다 더 간단합니다. 그리고 .NET 4.0에서는 더 많은 옵션을 사용할 수 있습니다. 내 블로그에 Expression 통해 코드를 작성하는 기본 사항을 보여줍니다.





expression-trees