Expression tree | Деревья выражений - Сценарии 

Page / - Изменено Alexandr Fokin в 2025/05/13 13:04 

Сценарии 
Изменено Alexandr Fokin
в 2025/05/13 13:04

Оглавление

Компиляция дерева в делегат	Expression
    .Lambda(expressionValiarble)
    .Compile();	
Простое копирование свойств одного класса в другой	 	
Маппинг на основе выражения доступа к свойству	 	
Вызов делегата при построении EpressionTree	Expression Trees and Invoking a Delegate
https://stackoverflow.com/questions/2215712/expression-trees-and-invoking-a-delegate	
Объявлений локальной переменной в блоке
(без передачи извне)	переменная типа указана из области видимости, но не определена 
https://question-it.com/questions/717473/peremennaja-tipa-ukazana-iz-oblasti-vidimosti-no-ne-opredelena	
 	How do I set a field value in an C# Expression tree?
https://stackoverflow.com/questions/321650/how-do-i-set-a-field-value-in-an-c-sharp-expression-tree	
Типизированый вызов конструктора	var constructorInfo = type.GetConstructors().First(e => e.Attributes.HasFlag(MethodAttributes.Public));
var constructorParameter1 = Expression.Parameter(typeof(bool));
var constructorExp = Expression.New(constructorInfo, constructorParameter1);

// Func<bool, object> or Func<bool, T>
var constructorDelegate = Expression
    .Lambda<Func<bool, object>>(
        constructorExp, 
        constructorParameter1
        )
    .Compile();
How do you call a constructor via an expression tree on an existing object?
https://stackoverflow.com/questions/16363838/how-do-you-call-a-constructor-via-an-expression-tree-on-an-existing-object	
Нетипизированый вызов	public delegate object ConstructorDelegate(object[]? Args);

public static ConstructorDelegate GetConstructorWithArgsDelegate(
    ConstructorInfo constructorInfo)
{
 ParameterExpression constructorParameters = Expression.Parameter(typeof(object?[]));

 Expression[] parameterExpressions;
 {
  ParameterInfo[] parametersInfos = constructorInfo.GetParameters();
  parameterExpressions = new Expression[parametersInfos.Length];

 for (int i = 0; i < parametersInfos.Length; i++)
  {
   ConstantExpression ithIndex = Expression.Constant(i);
   BinaryExpression ithParameter = Expression.ArrayIndex(
    constructorParameters, 
    ithIndex);
   UnaryExpression unboxedIthParameter = Expression.Convert(
    ithParameter, 
    parametersInfos[i].ParameterType
    );
   parameterExpressions[i] = unboxedIthParameter;
  }
 }

 NewExpression constructorCallExp = Expression.New(
  constructorInfo, 
  parameterExpressions);

var convertResultExp = Expression.Convert(
  constructorCallExp,
 typeof(object)
  );

var constructorHandler = Expression
  .Lambda<ConstructorDelegate>(
   convertResultExp, 
   constructorParameters
   )
  .Compile();

return constructorHandler;
}	object Func<object[]>
C# Expression tree: object array to Expression.New() parameters
https://stackoverflow.com/questions/67968927/c-sharp-expression-tree-object-array-to-expression-new-parameters	
public delegate object? MethodDelegate(object instance, object[]? Args);

public static MethodDelegate GetMethodWithArgsDelegate(
    MethodInfo methodInfo, 
    Type instanceType)
{
 ParameterExpression instanceParameter = Expression.Parameter(typeof(object));
 ParameterExpression methodParameters = Expression.Parameter(typeof(object?[]));

 Expression instanceExp;
 Expression[] parameterExpressions;
 {
  instanceExp = Expression.Convert(instanceParameter, instanceType);

  ParameterInfo[] parametersInfos = methodInfo.GetParameters();
  parameterExpressions = new Expression[parametersInfos.Length];

 for (int i = 0; i < parametersInfos.Length; i++)
  {
   ConstantExpression ithIndex = Expression.Constant(i);
   BinaryExpression ithParameter = Expression.ArrayIndex(
    methodParameters,
    ithIndex);
   UnaryExpression unboxedIthParameter = Expression.Convert(
    ithParameter,
    parametersInfos[i].ParameterType
    );
   parameterExpressions[i] = unboxedIthParameter;
  }
 }

var callExpression = Expression.Call(
  instanceExp,
  methodInfo,
  parameterExpressions
  );

var convertResultExp = Expression.Convert(
  callExpression, 
 typeof(object)
  );

var callHandler = Expression
  .Lambda<MethodDelegate>(
   convertResultExp, 
   instanceParameter, 
   methodParameters
   )
  .Compile();

return callHandler;
}	object? Func<object, object[]>	
 	
Generic enum to int