9 Nisan 2018 Pazartesi

Expression Sınıfı

Giriş
Şu satırı dahil ederiz.
using System.Linq.Expressions;
Constructor
Şöyle yaparız.
public class C<TSource, TDest> where TDest : new() {
  public Expression<Func<TSource, TDest>> Foo() => model => new TDest();

}
Body Alanı
Şöyle yaparız.
Expression<Func<IEnumerable<T>>> expression = ...;
var member = (MemberExpression)expression.Body;
Call Metodu
İfadeyi çalıştırır.
Örnek
Şöyle yaparız.
MethodInfo containsMethod = typeof(string).GetMethod("Contains");
MemberExpression member = ...;
Expression.Call(member, containsMethod,Expression.Convert(constant,member.Type));
Örnek
Elimizde şöyle bir nesne olsun.
Expression<Func<T, bool>>
Bu nesneyi Linq ile kullanabiliriz.
var exp = new Expression<Func<T, bool>> ...;
employees = new ObservableCollection<Employee>(EMP.AsQueryable().Where(exp)
Compile metodu
Örnek
Şöyle yaparız.
var par1 = 100;
var par2 = 200;
var par3 = 300;

Expression<Func<int, int, int, int>> expr = (a, b, c) => (a + b) / c;
Func<int, int, int, int> func = expr.Compile();

int result = func(par1, par2, par3);
Örnek
Derleyip çalıştırmak için şöyle yaparız.
Expression<Func<IEnumerable<T>>> expression = ...;
IEnumerable<T> value = expression.Compile()();
Şu kod ile aynıdır.
Func<IEnumerable<T>> del = expression.Compile();
IEnumerable<T> value = del();
Constant metodu
Factory metod olarak kullanılır. Başka bir nesne üretir.
object con;
ConstantExpression constant = Expression.Constant(con);
Equal metodu
Aritmetik metod olarak kullanılır. Şöyle yaparız.
MemberExpression member = ...;
ConstantExpression constant = ...;
Expression.Equal(member,Expression.Convert(constant, member.Type));
GreaterThan ve GreaterThanOrEqual metodları
Aritmetik metod olarak kullanılır. Şöyle yaparız.
Expression.GreaterThan(member,Expression.Convert(constant, member.Type));
ve
Expression.GreaterThanOrEqual(member,Expression.Convert(constant, member.Type));
LessThan ve LessThanOrEqual metodları
Aritmetik metod olarak kullanılır. Şöyle yaparız.
Expression.LessThan(member,Expression.Convert(constant, member.Type));
ve
Expression.LessThanOrEqual(member,Expression.Convert(constant, member.Type));
NodeType Alanı
Elimizde bir nesne olsun.
Expression<Func<int, string>> pred = ...
Eğer bu nesne lambda ile doldurulmuşsa şöyle yaparız.
if (pred.NodeType == ExpressionType.Lambda) {...}
Parameter metodu
Parameter metodu yazısına taşıdım.

ToString metodu
Şöyle yaparız.
Expression<Func<int, int, int, int>> expr = (a, b, c) => (a + b) / c;
string exprAsText = expr.ToString();
Variable metodu
İsmi ve tipi belirtilen bir değişken yaratır.
var temp1 = Expression.Variable(typeof(string), "temp1");
Bu değişkene değer atamayıp bir sabitten büyük olduğunu şöyle kodlarız.
//use int.Parse(string) here
var parseMethod = typeof(int).GetMethod("Parse", new[] { typeof(string) }); 

var gt = Expression.GreaterThan(Expression.Call(parseMethod, temp1), 
                                Expression.Constant(1));



Hiç yorum yok:

Yorum Gönder