(C#) 인스턴스는 Expression Tree를 사용하여 동적으로 생성됩니다.
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매개변수가 필요한 경우 인스턴스 생성하기
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보다 빠르게 인스턴스를 생성할 수 있습니다.
참고 자료
공식 트리
Reference
이 문제에 관하여((C#) 인스턴스는 Expression Tree를 사용하여 동적으로 생성됩니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/wattanx/articles/be894132aef68a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)