วิธีการขยายประเภทในตัว C # เช่น String?


91

ทักทายทุกคน ... ฉันต้อง แต่ฉันต้องการลบช่องว่างที่ซ้ำ ๆ กันทั้งหมดภายใน String เองไม่ใช่เฉพาะตอนท้ายหรือตอนเริ่มต้นเท่านั้น ฉันสามารถทำได้ด้วยวิธีการเช่น:TrimString

public static string ConvertWhitespacesToSingleSpaces(string value)
{
    value = Regex.Replace(value, @"\s+", " ");
}

ซึ่งผมได้จากที่นี่ แต่ฉันต้องการให้โค้ดชิ้นนี้ถูกเรียกใช้ภายในString.Trim()ตัวเองดังนั้นฉันคิดว่าฉันต้องขยายหรือโอเวอร์โหลดหรือแทนที่Trimเมธอด ... มีวิธีทำไหม?

ขอบคุณล่วงหน้า.

คำตอบ:


168

เนื่องจากคุณไม่สามารถขยายstring.Trim()ได้ คุณสามารถสร้างวิธีการขยายตามที่อธิบายไว้ที่นี่ซึ่งจะตัดและลดช่องว่าง

namespace CustomExtensions
{
    //Extension methods must be defined in a static class
    public static class StringExtension
    {
        // This is the extension method.
        // The first parameter takes the "this" modifier
        // and specifies the type for which the method is defined.
        public static string TrimAndReduce(this string str)
        {
            return ConvertWhitespacesToSingleSpaces(str).Trim();
        }

        public static string ConvertWhitespacesToSingleSpaces(this string value)
        {
            return Regex.Replace(value, @"\s+", " ");
        }
    }
}

คุณสามารถใช้มันได้

using CustomExtensions;

string text = "  I'm    wearing the   cheese.  It isn't wearing me!   ";
text = text.TrimAndReduce();

ให้คุณ

text = "I'm wearing the cheese. It isn't wearing me!";

ไฟล์ต้องการชื่อพิเศษหรือไม่? หรือบันทึกนี้ไว้ที่ไหน? สามารถใส่ลงในคลาส Util หรืออะไรทำนองนั้นได้หรือไม่?
ทดสอบ

1
@ การทดสอบคุณสามารถวางไว้ที่ใดก็ได้ตราบเท่าที่มีการอ้างอิงในโครงการของคุณ หากคุณใส่ไว้ในเนมสเปซเฉพาะให้นำมาใช้ด้วยคำสั่ง 'ใช้' เหมือนกับคลาสอื่น ๆ
Twicetimes

ทำไมคุณไม่คืน regex จากฟังก์ชัน TrimAndReduce? มันจะทำให้คำตอบของคุณอ่านง่ายขึ้นมาก เว้นแต่คุณจะใช้คำตอบของคุณมากจนต้องโทรไปหาที่อื่นฮ่า ๆ
ดับ

24

เป็นไปได้ไหม? ใช่ แต่ต้องใช้วิธีการขยายเท่านั้น

คลาสSystem.Stringถูกปิดผนึกดังนั้นคุณจึงไม่สามารถใช้การลบล้างหรือการสืบทอดได้

public static class MyStringExtensions
{
  public static string ConvertWhitespacesToSingleSpaces(this string value)
  {
    return Regex.Replace(value, @"\s+", " ");
  }
}

// usage: 
string s = "test   !";
s = s.ConvertWhitespacesToSingleSpaces();

5
เพื่อความชัดเจนไม่เป็นไปไม่ได้ที่จะแก้ไขการกระทำที่String.Trimเกิดขึ้น
Michael Petrotta

10

คำถามของคุณมีใช่และไม่ใช่

ได้คุณสามารถขยายประเภทที่มีอยู่ได้โดยใช้วิธีการขยาย วิธีการขยายตามธรรมชาติสามารถเข้าถึงได้เฉพาะอินเทอร์เฟซสาธารณะของประเภทเท่านั้น

public static string ConvertWhitespacesToSingleSpaces(this string value) {...}

// some time later...
"hello world".ConvertWhitespacesToSingleSpaces()

ไม่คุณไม่สามารถเรียกวิธีนี้Trim()ได้ วิธีการขยายไม่เข้าร่วมในการบรรทุกเกินพิกัด ฉันคิดว่าคอมไพเลอร์ควรให้ข้อความแสดงข้อผิดพลาดที่มีรายละเอียดนี้แก่คุณ

เมธอดส่วนขยายจะมองเห็นได้ก็ต่อเมื่อเนมสเปซที่มีชนิดที่กำหนดเมธอดนั้นใช้'ed



2

นอกจากการใช้วิธีการขยายซึ่งน่าจะเป็นตัวเลือกที่ดีที่นี่แล้วยังสามารถ "ห่อ" วัตถุ (เช่น "องค์ประกอบของวัตถุ") ตราบเท่าที่รูปแบบที่ห่อไว้ไม่มีข้อมูลมากไปกว่าสิ่งที่ห่อแล้วรายการที่ห่ออาจถูกส่งผ่านการแปลงโดยนัยหรืออย่างชัดเจนโดยไม่มีการสูญเสียข้อมูลเพียงแค่เปลี่ยนประเภท / อินเทอร์เฟซ

มีความสุขในการเขียนโค้ด

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