คุณสามารถเพิ่มส่วนขยายแบบคงที่ให้กับคลาสใน C # ได้หรือไม่? ไม่ แต่คุณสามารถทำได้:
public static class Extensions
{
public static T Create<T>(this T @this)
where T : class, new()
{
return Utility<T>.Create();
}
}
public static class Utility<T>
where T : class, new()
{
static Utility()
{
Create = Expression.Lambda<Func<T>>(Expression.New(typeof(T).GetConstructor(Type.EmptyTypes))).Compile();
}
public static Func<T> Create { get; private set; }
}
นี่คือวิธีการทำงาน ในขณะที่คุณไม่สามารถเขียนวิธีการขยายแบบคงที่ในทางเทคนิค แต่โค้ดนี้ใช้ช่องโหว่ในวิธีการขยาย ช่องโหว่นั้นเป็นสิ่งที่คุณสามารถเรียกใช้วิธีการส่วนขยายบนวัตถุ null โดยไม่ได้รับข้อยกเว้น null (ยกเว้นกรณีที่คุณเข้าถึงสิ่งใดผ่านทาง @this)
ดังนั้นนี่คือวิธีที่คุณจะใช้สิ่งนี้:
var ds1 = (null as DataSet).Create(); // as oppose to DataSet.Create()
// or
DataSet ds2 = null;
ds2 = ds2.Create();
// using some of the techniques above you could have this:
(null as Console).WriteBlueLine(...); // as oppose to Console.WriteBlueLine(...)
ตอนนี้ทำไมฉันถึงเลือกโทร constructor เริ่มต้นเป็นตัวอย่างและและทำไมฉันไม่ส่งคืน T () ใหม่ในตัวอย่างโค้ดแรกโดยไม่ทำขยะนิพจน์ทั้งหมด ดีวันนี้วันโชคดีของคุณเพราะคุณได้รับ 2fer ดังที่ผู้พัฒนา. NET ขั้นสูงรู้ว่า T () ใหม่จะช้าเพราะสร้างการเรียกไปยัง System.Activator ซึ่งใช้การสะท้อนเพื่อรับตัวสร้างเริ่มต้นก่อนที่จะเรียกมัน คุณบ้า Microsoft! อย่างไรก็ตามรหัสของฉันเรียกใช้ตัวสร้างเริ่มต้นของวัตถุโดยตรง
ส่วนขยายคงที่จะดีกว่านี้ แต่เวลาหมดหวังที่จะเรียกใช้มาตรการที่หมดหวัง