คำถามติดแท็ก extension-methods

วิธีการขยายเป็นคุณลักษณะภาษาของบางภาษาเช่น Swift, Visual Basic.NET และ C # วิธีการขยายช่วยให้คุณสามารถ "เพิ่ม" เมธอดประเภทที่มีอยู่ได้โดยไม่ต้องสร้างประเภทที่ได้รับใหม่การคอมไพล์ใหม่หรือแก้ไขประเภทเดิม

6
C # มีคุณสมบัติส่วนขยายหรือไม่
C # มีคุณสมบัติส่วนขยายหรือไม่ ตัวอย่างเช่นฉันสามารถเพิ่มคุณสมบัติส่วนขยายให้DateTimeFormatInfoเรียกได้ว่าShortDateLongTimeFormatจะส่งคืนShortDatePattern + " " + LongTimePatternหรือไม่

18
ความแตกต่าง () กับแลมบ์ดา?
ใช่ฉันมีจำนวนมากและต้องการรับค่าที่แตกต่างจากมัน ใช้มีแน่นอนวิธีขยายที่เรียกว่าSystem.Linq Distinctในกรณีง่าย ๆ มันสามารถใช้โดยไม่มีพารามิเตอร์เช่น: var distinctValues = myStringList.Distinct(); ดีและดี แต่ถ้าฉันมีจำนวนวัตถุที่ฉันต้องระบุความเท่าเทียมกันเกินพิกัดที่มีอยู่เท่านั้นคือ: var distinctValues = myCustomerList.Distinct(someEqualityComparer); อาร์กิวเมนต์เท่าเทียมกัน Comparer IEqualityComparer<T>ต้องเป็นตัวอย่างของ แน่นอนว่าฉันสามารถทำสิ่งนี้ได้ แต่มันค่อนข้างละเอียดและดูดี สิ่งที่ฉันคาดหวังก็คือโอเวอร์โหลดที่จะเอาแลมบ์ดาพูด Func <T, T, bool>: var distinctValues = myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId); มีใครทราบบ้างไหมว่าส่วนขยายดังกล่าวมีอยู่หรือไม่ หรือฉันกำลังพลาดอะไรอยู่? หรือมีวิธีระบุ IEqualityComparer inline (ทำให้ลำบากใจฉัน) หรือไม่ ปรับปรุง ฉันพบคำตอบของ Anders Hejlsberg ต่อการโพสต์ในฟอรัม MSDN ในหัวข้อนี้ เขาพูดว่า: ปัญหาที่คุณจะพบคือเมื่อวัตถุสองตัวเปรียบเทียบกันเท่ากับพวกเขาจะต้องมีค่าส่งคืน …

8
วิธีใดที่ทำงานได้ดีกว่า: .Any () vs .Count ()> 0
ในSystem.Linqnamespace ตอนนี้เราสามารถขยายของเราIEnumerable เป็นที่จะมีใด ๆ ()และนับ () วิธีการขยาย ฉันได้รับแจ้งเมื่อไม่นานมานี้ว่าหากฉันต้องการตรวจสอบว่าคอลเล็กชันมี 1 หรือมากกว่าไอเท็มอยู่ข้างในฉันควรใช้.Any()วิธีการขยายแทนวิธีการ.Count() > 0ต่อเนื่องจากวิธีการ.Count()ขยายต้องวนซ้ำทุกรายการ ประการที่สองคอลเลกชันบางรายที่มีคุณสมบัติ (ไม่ใช่วิธีขยาย) ที่เป็นหรือCount Lengthมันจะเป็นการดีกว่าถ้าจะใช้สิ่งเหล่านั้นแทน.Any()หรือ.Count()? อือ?

15
ฉันสามารถเพิ่มวิธีการขยายไปยังคลาสแบบคงที่ที่มีอยู่ได้หรือไม่
ฉันเป็นแฟนตัวยงของวิธีการขยายใน C # แต่ยังไม่เคยประสบความสำเร็จในการเพิ่มวิธีการขยายไปยังระดับคงที่เช่นคอนโซล ตัวอย่างเช่นถ้าฉันต้องการเพิ่มส่วนขยายใน Console เรียกว่า 'WriteBlueLine' เพื่อให้ฉันไปได้: Console.WriteBlueLine("This text is blue"); ฉันลองวิธีนี้โดยการเพิ่มวิธีการคงที่ในที่สาธารณะโดยใช้คอนโซลเป็นพารามิเตอร์ 'this' ... แต่ไม่มีลูกเต๋า! public static class Helpers { public static void WriteBlueLine(this Console c, string text) { Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine(text); Console.ResetColor(); } } สิ่งนี้ไม่ได้เพิ่มวิธี 'WriteBlueLine' ลงในคอนโซล ... ฉันทำผิดหรือเปล่า หรือขอสิ่งที่เป็นไปไม่ได้?

30
วิธีการขยายที่คุณชื่นชอบสำหรับ C # คืออะไร? (codeplex.com/extensionoverflow)
ล็อคแล้ว คำถามและคำตอบนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ มาทำรายการคำตอบที่คุณโพสต์วิธีการต่อยอดเยี่ยมและยอดนิยมวิธีการขยาย ข้อกำหนดคือจะต้องโพสต์โค้ดแบบเต็มและตัวอย่างและคำอธิบายเกี่ยวกับวิธีใช้ ขึ้นอยู่กับดอกเบี้ยที่สูงในหัวข้อนี้ผมมีการติดตั้งโครงการที่มาเปิดที่เรียกว่า extensionoverflow ในCodeplex โปรดทำเครื่องหมายคำตอบของคุณด้วยการยอมรับเพื่อใส่รหัสในโครงการ Codeplex กรุณาโพสต์ซอร์สโค้ดแบบเต็มไม่ใช่ลิงก์ ข่าว Codeplex: 24.08.2010 หน้า Codeplex อยู่ที่นี่แล้ว: http://extensionoverflow.codeplex.com/ 11.11.2008 XmlSerialize / XmlDeserializeถูกนำไปใช้งานและทดสอบหน่วยแล้วแล้ว 11.11.2008 ยังมีพื้นที่สำหรับนักพัฒนาเพิ่มเติม ;-) เข้าร่วมทันที! 11.11.2008 ผู้ควบคุมคนที่สามเข้าร่วมExtensionOverflowยินดีต้อนรับสู่BKristensen 11.11.2008 FormatWithขณะนี้มีการใช้งานและทดสอบหน่วยหน่วยทดสอบ contributer 2008/11/09 สองเข้าร่วมExtensionOverflow ยินดีต้อนรับสู่chakritชาคริต 09.11.2008 เราต้องการนักพัฒนาเพิ่มเติม ;-) 09.11.2008 ThrowIfArgumentIsNullในตอนนี้ถูกนำไปใช้และยูนิตทดสอบบน Codeplex

20
ทำไมไม่มีวิธีการขยาย ForEach ใน IEnumerable?
แรงบันดาลใจจากคำถามอื่นที่ถามเกี่ยวกับZipฟังก์ชั่นที่หายไป: เหตุใดจึงไม่มีForEachวิธีการขยายในEnumerableชั้นเรียน หรือที่ไหนก็ได้? ชั้นเดียวที่ได้รับวิธีการคือForEach List<>มีเหตุผลว่าทำไมมันหายไป (การแสดง)?

7
ใน C # จะเกิดอะไรขึ้นเมื่อคุณเรียกใช้เมธอดส่วนขยายบนวัตถุ null
มีการเรียกเมธอดด้วยค่า Null หรือให้ข้อยกเว้นการอ้างอิง Null หรือไม่? MyObject myObject = null; myObject.MyExtensionMethod(); // <-- is this a null reference exception? หากเป็นกรณีนี้ฉันไม่จำเป็นต้องตรวจสอบพารามิเตอร์ 'this' ของฉันอีกเลยใช่ไหม

6
แปลงสตริง [] ถึง int [] ในหนึ่งบรรทัดของรหัสโดยใช้ LINQ
ฉันมีอาร์เรย์ของจำนวนเต็มในรูปแบบสตริง: var arr = new string[] { "1", "2", "3", "4" }; ฉันต้องการอาร์เรย์ของจำนวนเต็ม 'ของจริง' ที่จะผลักดันมันต่อไป: void Foo(int[] arr) { .. } ฉันพยายามที่จะส่ง int และแน่นอนล้มเหลว: Foo(arr.Cast<int>.ToArray()); ฉันสามารถทำต่อไป: var list = new List<int>(arr.Length); arr.ForEach(i => list.Add(Int32.Parse(i))); // maybe Convert.ToInt32() is better? Foo(list.ToArray()); หรือ var list = new List<int>(arr.Length); arr.ForEach(i => { int …

9
วิธีการขยายต้องถูกกำหนดในคลาสที่ไม่ใช่แบบทั่วไป
ฉันได้รับข้อผิดพลาด: วิธีการขยายต้องถูกกำหนดในคลาสที่ไม่ใช่แบบทั่วไป ในบรรทัด: public class LinqHelper นี่คือคลาสตัวช่วยตามรหัส Mark Gavells ฉันสับสนจริง ๆ ว่าข้อผิดพลาดนี้หมายถึงอะไรเพราะฉันแน่ใจว่ามันทำงานได้ดีเมื่อฉันทิ้งไว้ในวันศุกร์! using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Linq.Expressions; using System.Reflection; /// <summary> /// Helper methods for link /// </summary> public class LinqHelper { public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string property) { return ApplyOrder<T>(source, property, "OrderBy"); …

4
รหัสเทียบเท่ากับคำสำคัญ 'ปล่อย' ในการเรียกใช้เมธอดส่วนขยาย LINQ ที่ถูกล่ามโซ่
ด้วยการใช้คุณสมบัติการทำความเข้าใจแบบสอบถามคอมไพเลอร์ C # คุณสามารถเขียนโค้ดดังนี้: var names = new string[] { "Dog", "Cat", "Giraffe", "Monkey", "Tortoise" }; var result = from animalName in names let nameLength = animalName.Length where nameLength > 3 orderby nameLength select animalName; ในการแสดงออกของแบบสอบถามข้างต้นletคำหลักที่ช่วยให้คุ้มค่าที่จะส่งผ่านไปข้างหน้าเพื่อที่และ orderby animalName.Lengthการดำเนินงานโดยไม่ต้องโทรซ้ำไป ชุดของวิธีการขยาย LINQ ที่เทียบเท่าที่เรียกว่าบรรลุคำหลัก "ให้" ทำอะไรที่นี่?

14
Java เทียบเท่ากับวิธีการขยาย C #
ฉันกำลังมองหาการใช้งานฟังก์ชั่นในรายการวัตถุเช่นเดียวกับใน C # โดยใช้วิธีการขยาย บางสิ่งเช่นนี้ List<DataObject> list; // ... List initialization. list.getData(id); ฉันจะทำสิ่งนั้นใน Java ได้อย่างไร

6
ผู้ประกอบการมากไปด้วยวิธีการขยาย C #
ฉันกำลังพยายามใช้วิธีการขยายเพื่อเพิ่มตัวดำเนินการเกินพิกัดให้กับStringBuilderคลาสC # โดยเฉพาะได้รับStringBuilder sbฉันต้องการที่จะกลายเป็นเทียบเท่ากับsb += "text"sb.Append("text") นี่คือไวยากรณ์สำหรับการสร้างวิธีการขยายสำหรับStringBuilder: public static class sbExtensions { public static StringBuilder blah(this StringBuilder sb) { return sb; } } มันประสบความสำเร็จเพิ่มวิธีขยายไปยังblahStringBuilder น่าเสียดายที่การใช้งานมากเกินไปดูเหมือนจะไม่ทำงาน: public static class sbExtensions { public static StringBuilder operator +(this StringBuilder sb, string s) { return sb.Append(s); } } ในประเด็นอื่น ๆ คำหลักthisไม่ได้รับอนุญาตในบริบทนี้ มีการเพิ่มโอเปอเรเตอร์เกินพิกัดผ่านวิธีการขยายหรือไม่ ถ้าอย่างนั้นเป็นวิธีที่เหมาะสมที่จะไปเกี่ยวกับมันคืออะไร?

7
เยาะเย้ยวิธีการขยายด้วยขั้นต่ำ
ฉันมีส่วนต่อประสานก่อนหน้า ... public interface ISomeInterface { void SomeMethod(); } และฉันได้ขยายอินเทอร์เฟซนี้โดยใช้มิกซ์อิน ... public static class SomeInterfaceExtensions { public static void AnotherMethod(this ISomeInterface someInterface) { // Implementation here } } ฉันมีคลาสที่เรียกสิ่งนี้ซึ่งฉันต้องการทดสอบ ... public class Caller { private readonly ISomeInterface someInterface; public Caller(ISomeInterface someInterface) { this.someInterface = someInterface; } public void Main() { …

8
Razor HtmlHelper Extensions (หรือเนมสเปซอื่นสำหรับมุมมอง) ไม่พบ
Dunno หากสิ่งนี้เกิดขึ้นใน PR หรือเบต้า แต่ถ้าฉันสร้างวิธีการต่อขยายHtmlHelperมันจะไม่ได้รับการยอมรับในหน้ามีดโกนที่ใช้พลังงาน: namespace SomeNamespace.Extensions { public static class HtmlExtensions { public static string Foo(this HtmlHelper html) { return "Foo"; } } } ฉันเพิ่มลงใน<Namespaces>ส่วนในWeb.config: <pages> <namespaces> <add namespace="System.Web.Mvc" /> <!-- snip --> <add namespace="SomeNamespace.Extensions"/> </namespaces> </pages> แต่จะมีข้อผิดพลาดในการคอมไพล์เมื่อพยายามดูหน้า: @Html.Foo() หากฉันสร้างหน้าขึ้นใหม่ด้วยWebFormsก็ใช้งานได้ดี ตกลงคืออะไร? วิธีแก้ปัญหา หากฉันรวม@using SomeNamespace.Extensionsไว้ในมุมมองมีดโกนของฉันแล้วก็ใช้งานได้ แต่ฉันก็อยากจะลองใช้ดูWeb.config

4
ลองกับทรัพยากรใน Kotlin
เมื่อฉันพยายามเขียนเทียบเท่า Java tryโค้ด -with-resourcesใน Kotlin มันไม่ได้ผลสำหรับฉัน ฉันลองรูปแบบต่าง ๆ ต่อไปนี้: try (writer = OutputStreamWriter(r.getOutputStream())) { // ... } แต่ก็ไม่ได้ผล ไม่มีใครรู้ว่าสิ่งที่ควรใช้แทน? เห็นได้ชัดว่า Kotlin ไวยากรณ์ไม่ได้มีความหมายสำหรับการสร้างดังกล่าว แต่บางทีฉันอาจจะขาดอะไรบางอย่าง มันกำหนดไวยากรณ์สำหรับลองบล็อกดังนี้: try : "try" block catchBlock* finallyBlock?;

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.