(C#) 인스턴스는 Expression Tree를 사용하여 동적으로 생성됩니다.

12560 단어 C#tech

Expression Tree 소개


익스프레스션 트리(식목)란 나무 구조로 식(공식)을 나타내는 물건이다.
예를 들어, X+Y는 다음과 같습니다.

Expression Tree 로 표시된 코드를 컴파일하여 실행
실행 가능한 코드를 동적으로 수정하거나 동적 조회를 만들 수 있습니다.

람다식 Expression Tree 제작


람다식이 Expression형 변수에 분배되면 익명의 델리멘이 아닌 표현식 트리로 컴파일됩니다.
예를 들어 아래의 두 코드는 같은 뜻이다.
Expression<Func<int, int>> exp = x => x + 5; 
// 引数x の式
var arg = Expression.Parameter(typeof(int), "x");
// x + 5の式
var body = Expression.Add(x, Expression.Constant(5));
// x => x + 5の式
var exp = Expression.Lambda<Func<int, int>>(body, x);
Expression.Add 메서드는 2가지 연산의 더하기(+)입니다.
각 연산자와 대응하는 방법을 준비했다.

Expression Tree를 사용하여 인스턴스 생성


Expression Tree를 사용하여 인스턴스를 동적으로 생성할 수도 있습니다.
다음 InstanceCreator 클래스는 조립된 나무를 컴파일한 후 경계부호로 반환됩니다.
참조
public static class InstanceCreator<T>
{
    /// <summary>
    /// T型のインスタンスを生成します
    /// </summary>
    public static Func<T> Create => CreateInstance();
    public static Func<T> CreateInstance()
    {
        return Expression.Lambda<Func<T>>(Expression.New(typeof(T))).Compile();
    }
}
x=>x+5의 예
body(x+5)의 부분Expression.New(typeof(T))Expression.New 방법은 지정된 유형의 구조기를 만드는 방법입니다.
다음 방법을 사용하여 인스턴스를 생성할 수 있습니다.
public class Person { }
public class Test
{
  public void InstanceCreateTest()
  {
      var person = new Person();
      var expressionPerson = InstanceCreator<Person>.Create();
  }
}

new Person()과 InstanceCreater.Create()와 함께 Person 클래스의 인스턴스를 생성합니다.

매개변수가 필요한 경우 인스턴스 생성하기


public static class InstanceCreator<TParam, TInstance>
{
    /// <summary>
    /// 一つの引数を受け取ってTInstance型のインスタンスを生成します
    /// </summary>
    public static Func<TParam, TInstance> Create => CreateInstance();
    public static Func<TParam, TInstance> CreateInstance()
    {
        var argsType = new[] { typeof(TParam) };
        var constructor = typeof(TInstance).GetConstructor(argsType);
        var args = argsType.Select(Expression.Parameter).ToList();
        return Expression.Lambda<Func<TParam, TInstance>>(Expression.New(constructor, args), args).Compile();
    }
}

언제 시작 해요?


동적 인스턴스를 생성하는 데 사용할 수 있습니다.
new () 제한을 사용하면 Genesis를 사용해도 실례를 만들 수 있지만 속도가 느립니다.
Expression Tree를 사용하면 new() T보다 빠르게 인스턴스를 생성할 수 있습니다.

참고 자료


공식 트리

좋은 웹페이지 즐겨찾기