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

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

16
แปลงสตริงเป็นชนิด nullable (int, double, etc …)
ฉันพยายามแปลงข้อมูลบางอย่าง น่าเสียดายที่ข้อมูลส่วนใหญ่อยู่ในสตริงซึ่งควรเป็น int หรือ double เป็นต้น ดังนั้นสิ่งที่ฉันมีคือ: double? amount = Convert.ToDouble(strAmount); ปัญหาของวิธีนี้คือถ้า strAmount ว่างเปล่าถ้ามันว่างเปล่าฉันต้องการให้มันเป็นจำนวนว่างดังนั้นเมื่อฉันเพิ่มลงในฐานข้อมูลคอลัมน์จะเป็นโมฆะ ดังนั้นฉันจึงลงเอยด้วยการเขียนสิ่งนี้: double? amount = null; if(strAmount.Trim().Length>0) { amount = Convert.ToDouble(strAmount); } ตอนนี้ใช้ได้ดี แต่ตอนนี้ฉันมีโค้ดห้าบรรทัดแทนที่จะเป็นหนึ่งบรรทัด สิ่งนี้ทำให้อ่านยากขึ้นเล็กน้อยโดยเฉพาะเมื่อฉันมีคอลัมน์จำนวนมากที่ต้องแปลง ฉันคิดว่าฉันจะใช้ส่วนขยายของคลาสสตริงและของทั่วไปเพื่อส่งเป็นประเภทเพราะนี่อาจเป็น double หรือ int หรือยาวก็ได้ ดังนั้นฉันจึงลองทำสิ่งนี้: public static class GenericExtension { public static Nullable<T> ConvertToNullable<T>(this string s, T type) where T: struct …

13
ฉันสามารถ "คูณ" สตริง (ใน C #)?
สมมติว่าฉันมีสตริงตัวอย่างเช่น string snip = "</li></ul>"; ฉันต้องการเขียนหลายครั้งขึ้นอยู่กับค่าจำนวนเต็ม string snip = "</li></ul>"; int multiplier = 2; // TODO: magic code to do this // snip * multiplier = "</li></ul></li></ul>"; แก้ไข: ฉันรู้ว่าฉันสามารถเขียนฟังก์ชั่นของตัวเองเพื่อนำไปใช้งานได้ง่ายฉันแค่สงสัยว่ามีตัวดำเนินการสตริงแปลก ๆ ที่ฉันไม่รู้

2
วิธีการเพิ่มวิธีการใหม่ในประเภทที่มีอยู่ใน Go?
ฉันต้องการเพิ่มวิธีการใช้งานที่สะดวกในgorilla/muxประเภทเส้นทางและเราเตอร์: package util import( "net/http" "github.com/0xor1/gorillaseed/src/server/lib/mux" ) func (r *mux.Route) Subroute(tpl string, h http.Handler) *mux.Route{ return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) } func (r *mux.Router) Subroute(tpl string, h http.Handler) *mux.Route{ return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h) } แต่คอมไพเลอร์แจ้งให้ฉันทราบ ไม่สามารถกำหนดวิธีการใหม่บน mux.Router ประเภทที่ไม่ใช่โลคัล แล้วฉันจะบรรลุเป้าหมายนี้ได้อย่างไร? ฉันสร้างประเภทโครงสร้างใหม่ที่มีช่อง mux.Route และ mux.Router แบบไม่ระบุชื่อหรือไม่ หรืออย่างอื่น?

1
สามารถใช้วิธีการขยายกับอินเทอร์เฟซได้หรือไม่?
เป็นไปได้ไหมที่จะใช้วิธีการขยายกับอินเทอร์เฟซ (คำถาม C #) ตัวอย่างเช่นเพื่อให้บรรลุสิ่งต่อไปนี้: สร้างอินเทอร์เฟซ ITopology สร้างเมธอดส่วนขยายสำหรับอินเทอร์เฟซนี้ (เช่น public static int CountNodes (ITopology topologyIf นี้)) จากนั้นเมื่อสร้างคลาส (เช่น MyGraph) ซึ่งใช้ ITopology มันจะมีส่วนขยาย Count Nodes โดยอัตโนมัติ วิธีนี้คลาสที่ใช้อินเทอร์เฟซไม่จำเป็นต้องมีชื่อคลาสที่กำหนดเพื่อให้สอดคล้องกับสิ่งที่กำหนดไว้ในเมธอดส่วนขยาย

8
เพิ่มช่วงไปยังคอลเลกชัน
เพื่อนร่วมงานถามฉันในวันนี้ว่าจะเพิ่มช่วงลงในคอลเล็กชันได้อย่างไร Collection<T>เขามีชั้นเรียนที่สืบทอดจาก มีคุณสมบัติรับอย่างเดียวประเภทนั้นที่มีบางรายการอยู่แล้ว เขาต้องการเพิ่มรายการในคอลเล็กชันอื่นในคอลเล็กชันคุณสมบัติ เขาทำแบบ C # 3-friendly ได้อย่างไร? (สังเกตข้อ จำกัด เกี่ยวกับคุณสมบัติ get-only ซึ่งป้องกันโซลูชันเช่นการทำ Union และการกำหนดใหม่) แน่นอน foreach กับ Property แอดจะทำงาน แต่List<T>AddRange สไตล์จะดูหรูหรากว่ามาก ง่ายพอที่จะเขียนวิธีการขยาย: public static class CollectionHelpers { public static void AddRange<T>(this ICollection<T> destination, IEnumerable<T> source) { foreach (T item in source) { destination.Add(item); } } } แต่ฉันมีความรู้สึกว่าฉันกำลังคิดค้นล้อใหม่ ฉันไม่พบอะไรในที่คล้ายกันSystem.Linqหรือmorelinq …

4
มีวิธีใดบ้างใน C # ที่จะแทนที่เมธอดคลาสด้วยเมธอดส่วนขยาย?
มีบางครั้งที่ฉันต้องการแทนที่เมธอดในคลาสด้วยเมธอดส่วนขยาย มีวิธีใดบ้างที่จะทำใน C #? ตัวอย่างเช่น: public static class StringExtension { public static int GetHashCode(this string inStr) { return MyHash(inStr); } } กรณีที่ฉันต้องการทำเช่นนี้คือสามารถจัดเก็บแฮชของสตริงลงในฐานข้อมูลและมีการใช้ค่าเดียวกันกับคลาสทั้งหมดที่ใช้แฮชของคลาสสตริง (เช่นพจนานุกรมเป็นต้น) ตั้งแต่ ไม่รับประกันว่าอัลกอริทึมการแฮช. Net ในตัวจะเข้ากันได้จาก Framework รุ่นหนึ่งไปอีกเวอร์ชันหนึ่งฉันต้องการแทนที่ด้วยของฉันเอง มีอีกกรณีหนึ่งที่ฉันพบว่าฉันต้องการแทนที่เมธอดคลาสด้วยเมธอดส่วนขยายเช่นกันดังนั้นจึงไม่เฉพาะเจาะจงกับคลาสสตริงหรือเมธอด GetHashCode ฉันรู้ว่าฉันสามารถทำสิ่งนี้ได้ด้วยการแบ่งคลาสย่อยออกจากคลาสที่มีอยู่ แต่มันจะสะดวกมากที่จะสามารถทำกับส่วนขยายได้ในหลาย ๆ กรณี

9
ฉันจะขยายคลาสด้วยวิธีการขยาย c # ได้อย่างไร
สามารถใช้วิธีการขยายกับคลาสได้หรือไม่? ตัวอย่างเช่นขยาย DateTime เพื่อรวมเมธอด Tomorrow () ที่สามารถเรียกใช้เช่น: DateTime.Tomorrow(); ฉันรู้ว่าฉันสามารถใช้ได้ static DateTime Tomorrow(this Datetime value) { //... } หรือ public static MyClass { public static Tomorrow() { //... } } สำหรับผลลัพธ์ที่คล้ายกัน แต่ฉันจะขยาย DateTime เพื่อให้ฉันสามารถเรียก DateTime.Tomorrow ได้อย่างไร

5
วิธีใช้ส่วนขยายหลักของ Active Support
ฉันติดตั้ง Active Support 3.0.3 และ Rails 3.0.3 พร้อม Ruby 1.8.7 เมื่อลองใช้1.week.agoแล้วจะได้รับ NoMethodError: undefined method 'week' for 1:Fixnum from (irb):2 ส่วนขยายหลักอื่น ๆ ดูเหมือนจะใช้งานได้ ฉันลองใช้บนคอมพิวเตอร์ของเพื่อน (ข้อกำหนดการติดตั้งเดียวกันและเวอร์ชันเดิมอยู่ในเครื่องของเขา) โดยได้ผลลัพธ์เหมือนกัน สิ่งที่ช่วยให้? ทั้งหมดนี้อยู่ใน IRB

2
วิธีการต่อ LINQ“ พับ” อยู่ที่ไหน
ฉันพบในตัวอย่าง Linq ของ MSDN ซึ่งเป็นวิธีการที่เรียกว่า Fold () ที่ฉันต้องการใช้ ตัวอย่างของพวกเขา: double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 }; double product = doubles.Fold((runningProduct, nextFactor) => runningProduct * nextFactor); น่าเสียดายที่ฉันไม่สามารถรวบรวมสิ่งนี้ได้ทั้งในตัวอย่างหรือในโค้ดของฉันเองและฉันไม่พบที่อื่นใน MSDN (เช่นวิธีการ Enumerable หรือวิธีการขยาย Array) ที่พูดถึงวิธีนี้ ข้อผิดพลาดที่ฉันได้รับเป็นข้อผิดพลาด "ไม่รู้อะไรเลย" แบบเก่า: error CS1061: 'System.Array' does not contain a definition for 'Fold' and no …


5
วิธีการขยายประเภทในตัว C # เช่น String?
ทักทายทุกคน ... ฉันต้อง แต่ฉันต้องการลบช่องว่างที่ซ้ำ ๆ กันทั้งหมดภายใน String เองไม่ใช่เฉพาะตอนท้ายหรือตอนเริ่มต้นเท่านั้น ฉันสามารถทำได้ด้วยวิธีการเช่น:TrimString public static string ConvertWhitespacesToSingleSpaces(string value) { value = Regex.Replace(value, @"\s+", " "); } ซึ่งผมได้จากที่นี่ แต่ฉันต้องการให้โค้ดชิ้นนี้ถูกเรียกใช้ภายในString.Trim()ตัวเองดังนั้นฉันคิดว่าฉันต้องขยายหรือโอเวอร์โหลดหรือแทนที่Trimเมธอด ... มีวิธีทำไหม? ขอบคุณล่วงหน้า.

6
ฉันจะใช้ Moq เพื่อจำลองวิธีการขยายได้อย่างไร
ฉันกำลังเขียนการทดสอบที่ขึ้นอยู่กับผลลัพธ์ของวิธีการขยาย แต่ฉันไม่ต้องการให้ความล้มเหลวในอนาคตของวิธีการขยายนั้นทำลายการทดสอบนี้ การเยาะเย้ยผลลัพธ์นั้นดูเหมือนเป็นทางเลือกที่ชัดเจน แต่Moq ดูเหมือนจะไม่เสนอวิธีที่จะแทนที่วิธีการแบบคงที่ (ข้อกำหนดสำหรับวิธีการขยาย) มีความคิดที่คล้ายกันกับ Moq.Protected และ Moq.Stub แต่ดูเหมือนจะไม่เสนออะไรให้กับสถานการณ์นี้ ฉันพลาดอะไรไปหรือฉันควรจะไปทางอื่น นี่เป็นตัวอย่างเล็ก ๆ น้อย ๆ ที่ล้มเหลวด้วยปกติ"ความคาดหวังที่ไม่ถูกต้องเกี่ยวกับการเป็นสมาชิกที่ไม่ใช่ overridable" นี่เป็นตัวอย่างที่ไม่ดีที่ต้องล้อเลียนวิธีการขยาย แต่ควรทำ public class SomeType { int Id { get; set; } } var ListMock = new Mock<List<SomeType>>(); ListMock.Expect(l => l.FirstOrDefault(st => st.Id == 5)) .Returns(new SomeType { Id = 5 }); …

30
คุณพบข้อดีของวิธีการขยายอะไรบ้าง? [ปิด]
ตามที่กล่าวมาในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดขึ้นมาใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา "ผู้ไม่เชื่อ" ของ C # ถามฉันว่าจุดประสงค์ของวิธีการขยายคืออะไร ฉันอธิบายว่าคุณสามารถเพิ่มวิธีการใหม่ให้กับวัตถุที่กำหนดไว้แล้วโดยเฉพาะอย่างยิ่งเมื่อคุณไม่ได้เป็นเจ้าของ / ควบคุมแหล่งที่มาให้กับวัตถุดั้งเดิม เขาพูดขึ้นมาว่า "ทำไมไม่เพิ่มวิธีการในชั้นเรียนของคุณเอง" เราไปมาเรื่อย ๆ (ในทางที่ดี) คำตอบทั่วไปของฉันคือมันเป็นอีกเครื่องมือหนึ่งในแถบเครื่องมือและคำตอบของเขาก็คือการเสียเครื่องมือไปโดยเปล่าประโยชน์ ... แต่ฉันคิดว่าฉันจะได้คำตอบที่ "รู้แจ้ง" มากกว่า มีสถานการณ์ใดบ้างที่คุณเคยใช้เมธอดส่วนขยายที่คุณไม่มี (หรือไม่ควรมี) โดยใช้เมธอดที่เพิ่มในคลาสของคุณเอง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.