การสร้างนิพจน์ด้วยตนเอง
สร้างต้นไม้นิพจน์ด้วย Expression API
การสร้างนิพจน์ด้วยตนเอง เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
การสร้างแผนผังด้วยตนเอง
นอกจากให้คอมไพเลอร์สร้างแผนผังจากแลมบ์ดาแล้ว คุณยังสร้างแผนผังด้วยตนเองได้โดยใช้เมธอดโรงงานแบบ static บน Expression
using System;
using System.Linq.Expressions;
var five = Expression.Constant(5);
Console.WriteLine(five); // 5
Console.WriteLine(five.Type); // System.Int32Expression.Parameter
Expression.Parameter(type, name) สร้างโหนดพารามิเตอร์ที่คุณสามารถอ้างอิงใน body และผูกเข้ากับแลมบ์ดาได้
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
Console.WriteLine(x.Name + " : " + x.Type); // x : System.Int32Expression.Constant
Expression.Constant(value) ฝังค่าแบบตัวอักษรไว้ในนิพจน์ คุณสามารถระบุชนิดข้อมูลเพิ่มเติมได้หากต้องการ
using System;
using System.Linq.Expressions;
var c = Expression.Constant(42);
var typed = Expression.Constant(3.14, typeof(double));
Console.WriteLine(c + " " + typed); // 42 3.14Expression.Add
ตัวดำเนินการไบนารีมีเมธอดโรงงาน เช่น Expression.Add เมธอดเหล่านี้รับนิพจน์ตัวถูกดำเนินการสองตัวแล้วสร้าง BinaryExpression
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var sum = Expression.Add(x, Expression.Constant(1));
Console.WriteLine(sum); // (x + 1)ตัวดำเนินการไบนารีอื่น ๆ
มีเมธอดโรงงานสำหรับชุดตัวดำเนินการทั้งหมด ได้แก่ Subtract, Multiply, Divide, GreaterThan, Equal และอื่น ๆ
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var gt = Expression.GreaterThan(x, Expression.Constant(10));
var mul = Expression.Multiply(x, Expression.Constant(2));
Console.WriteLine(gt + " | " + mul); // (x > 10) | (x * 2)การห่อหุ้มเป็นแลมบ์ดา
Expression.Lambda เชื่อม body และพารามิเตอร์เข้าด้วยกันเป็น Expression<TDelegate> ซึ่งคุณสามารถ Compile ได้ภายหลัง
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var body = Expression.Add(x, Expression.Constant(1));
var lambda = Expression.Lambda<Func<int, int>>(body, x);
Console.WriteLine(lambda); // x => (x + 1)การประกอบนิพจน์ที่ซ้อนกัน
เมธอดโรงงานสามารถซ้อนกันได้อย่างอิสระ คุณจึงสร้างนิพจน์ซับซ้อนอย่าง (x + 1) * 2 ทีละขั้นตอนได้
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var addOne = Expression.Add(x, Expression.Constant(1));
var timesTwo = Expression.Multiply(addOne, Expression.Constant(2));
Console.WriteLine(timesTwo); // ((x + 1) * 2)การเข้าถึงสมาชิก
Expression.Property และ Expression.Field ใช้สร้างโหนดสำหรับการเข้าถึงสมาชิก
using System;
using System.Linq.Expressions;
var s = Expression.Parameter(typeof(string), "s");
var lengthAccess = Expression.Property(s, "Length");
Console.WriteLine(lengthAccess); // s.Lengthการเรียกเมธอด
Expression.Call สร้างโหนดการเรียกใช้ โดยรับเป้าหมาย เมธอด และอาร์กิวเมนต์
using System;
using System.Linq.Expressions;
var s = Expression.Parameter(typeof(string), "s");
var toUpper = typeof(string).GetMethod("ToUpper", Type.EmptyTypes);
var call = Expression.Call(s, toUpper);
Console.WriteLine(call); // s.ToUpper()การตรวจสอบชนิดขณะสร้าง
เมธอดโรงงานจะตรวจสอบชนิดของตัวถูกดำเนินการระหว่างการสร้าง หากชนิดไม่ตรงกันจะเกิดข้อผิดพลาดทันที ทำให้พบข้อผิดพลาดได้ตั้งแต่เนิ่น ๆ
using System;
using System.Linq.Expressions;
try {
var bad = Expression.Add(
Expression.Constant(1),
Expression.Constant("text")); // int + string
} catch (InvalidOperationException) {
Console.WriteLine("type mismatch rejected");
}การนำแนวคิดทั้งหมดมาประกอบกัน
สร้างแลมบ์ดา x => (x + 1) * 2 ด้วยตนเองทั้งหมด
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var body = Expression.Multiply(
Expression.Add(x, Expression.Constant(1)),
Expression.Constant(2));
var lambda = Expression.Lambda<Func<int, int>>(body, x);
Console.WriteLine(lambda); // x => ((x + 1) * 2)แบบทดสอบสั้น ๆ
ยืนยันความเข้าใจเกี่ยวกับการสร้างนิพจน์ด้วยตนเอง
สรุปทบทวน
คุณได้เรียนรู้การสร้างแผนผังนิพจน์ด้วยตนเอง
Expression.ParameterและExpression.Constantใช้สร้างโหนดปลายทางExpression.Addและเมธอดที่เกี่ยวข้องใช้สร้างการดำเนินการแบบไบนารีExpression.PropertyและExpression.Callใช้จัดการสมาชิกและเมธอดExpression.Lambdaใช้ประกอบแผนผังที่เรียกใช้ได้
คำถามที่พบบ่อย
บทเรียน “การสร้างนิพจน์ด้วยตนเอง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างนิพจน์ด้วยตนเอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างนิพจน์ด้วยตนเอง”
สร้างต้นไม้นิพจน์ด้วย Expression API คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้างนิพจน์ด้วยตนเอง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ต้นไม้นิพจน์คืออะไร
- การสร้างนิพจน์ด้วยตนเอง
- การคอมไพล์และเรียกใช้นิพจน์
- ต้นไม้นิพจน์ในผู้ให้บริการ LINQ