ฉันจะเปลี่ยนชื่อคลาสใน C # โดยไม่ต้องเพิ่มบรรทัดของโค้ดให้กับทุกไฟล์ที่ใช้คลาสได้อย่างไร


88

ฉันต้องการสร้างนามแฝงสำหรับชื่อคลาส ไวยากรณ์ต่อไปนี้จะสมบูรณ์แบบ:

public class LongClassNameOrOneThatContainsVersionsOrDomainSpecificName
{
   ...
}

public class MyName = LongClassNameOrOneThatContainsVersionOrDomainSpecificName;

แต่จะไม่รวบรวม


ตัวอย่าง

หมายเหตุตัวอย่างนี้จัดทำขึ้นเพื่อความสะดวกเท่านั้น อย่าพยายามแก้ปัญหานี้โดยแนะนำให้เปลี่ยนการออกแบบของระบบทั้งหมด การมีอยู่หรือขาดหายไปของตัวอย่างนี้ไม่ได้ทำให้คำถามเดิมเปลี่ยนไป

รหัสที่มีอยู่บางส่วนขึ้นอยู่กับการมีอยู่ของคลาสคงที่:

public static class ColorScheme
{
   ...
}

โทนสีนี้เป็นโทนสีของ Outlook 2003 ฉันต้องการแนะนำโครงร่างสีของ Outlook 2007 ในขณะที่ยังคงรักษารูปแบบสีของ Outlook 2003 ไว้:

public static class Outlook2003ColorScheme
{
   ...
}

public static class Outlook2007ColorScheme
{
   ...
}

ColorSchemeแต่ฉันยังคงต้องเผชิญกับความจริงที่ว่ารหัสจะขึ้นอยู่กับการปรากฏตัวของระดับคงที่ที่เรียกว่า ความคิดแรกของฉันคือการสร้างColorSchemeคลาสที่ฉันจะสืบทอดจากอย่างใดอย่างหนึ่งOutlook2003หรือOutlook2007:

public static class ColorScheme : Outlook2007ColorScheme
{
}

แต่คุณไม่สามารถสืบทอดจากคลาสคงที่

ความคิดต่อไปของฉันคือการสร้างColorSchemeคลาสแบบคงที่แต่สร้างOutlook2003ColorSchemeและOutlook2007ColorSchemeคลาสไม่คงที่ จากนั้นตัวแปรคงที่ในColorSchemeคลาสคงที่สามารถชี้ไปที่โครงร่างสี "จริง":

public static class ColorScheme
{
    private static CustomColorScheme = new Outlook2007ColorScheme();
    ...
}

private class CustomColorScheme 
{ 
   ...
}

private class Outlook2008ColorScheme : CustomColorScheme 
{
    ...
}

private class Outlook2003ColorScheme : CustomColorScheme 
{
   ...
}

แต่นั่นทำให้ฉันต้องแปลงคลาสที่ประกอบไปด้วยสีคงที่แบบอ่านอย่างเดียวเป็นคุณสมบัติที่เขียนทับได้จากนั้นColorSchemeคลาสของฉันจะต้องมีตัวรับคุณสมบัติที่แตกต่างกัน 30 ตัวที่โยนลงไปในวัตถุที่มีอยู่

นั่นเป็นเพียงการพิมพ์มากเกินไป

ดังนั้นความคิดต่อไปของฉันคือการตั้งชื่อแทนชั้น:

public static ColorScheme = Outlook2007ColorScheme;

แต่ไม่ได้รวบรวม

ฉันจะเปลี่ยนชื่อคลาสแบบคงที่เป็นชื่ออื่นได้อย่างไร


อัปเดต:ใครช่วยเพิ่มคำตอบ"คุณไม่สามารถทำได้ใน C #"เพื่อให้ฉันสามารถทำเครื่องหมายว่าเป็นคำตอบที่ยอมรับได้ ใครก็ตามที่ต้องการคำตอบสำหรับคำถามเดียวกันนี้จะพบคำถามนี้คำตอบที่ยอมรับและวิธีแก้ปัญหาจำนวนหนึ่งที่อาจเป็นประโยชน์หรือไม่ก็ได้

ฉันแค่อยากจะปิดคำถามนี้


คุณอาจยอมรับคำตอบของ Chris แม้ว่าคุณจะไม่ต้องการนำไปใช้ก็ตาม
devio

2
ไม่ใช่คำตอบ แต่เป็นวิธีแก้ปัญหาชั่วคราว คำตอบคือคุณทำไม่ได้อย่างน้อยก็จนกว่าจะมีคนมาโพสต์ไวยากรณ์จริงเพื่อทำ
Ian Boyd

1
สำหรับใครก็ตามที่มาที่นี่คำตอบที่ยอมรับนั้นไม่ถูกต้องเนื่องจากความคิดเห็นที่ได้รับคะแนนสูงสุดทำงานได้ดีในโครงการ VS 2010 และ VS 2017 c # ที่ฉันกำลังทำอยู่ ต้องใช้เนมสเปซแบบเต็มเพื่อระบุคลาสเมื่อตั้งค่านามแฝง แต่เมื่อตั้งค่านามแฝงจะทำงานภายในขอบเขตที่กำหนดไว้
J-Americano

ฉันต้องอ่านคำตอบของเอียนและความคิดเห็นของเขาอย่างละเอียดก่อนที่ฉันจะเข้าใจสิ่งที่เขากำลังมองหา เขาต้องการประกาศนามแฝงของคลาสในที่เดียวแทนที่จะต้องเพิ่มที่ด้านบนของทุกไฟล์ที่อ้างอิงคลาส ฉันไม่ทราบว่ามีภาษาพิมพ์ผิดที่รองรับสิ่งนี้ (ถ้ามีใครรู้ภาษานี้ฉันก็อยากรู้) ฉันได้แก้ไขชื่อเรื่องนี้เพื่อให้ชัดเจนขึ้น
ToolmakerSteve

BTW สำหรับใครก็ตามที่พยายามทำสิ่งที่คล้ายกัน: หากนี่คือคลาสที่คุณกำลังกำหนดแนวทาง C # คือการกำหนด an interfaceซึ่งคลาสทั้งหมดของคุณนำไปใช้ ตามที่ระบุไว้ในคำตอบของ chills42 จากนั้นคุณสามารถกำหนด "บริการ" หรือ "โรงงาน" ซึ่งส่งคืนอ็อบเจ็กต์ที่ใช้อินเทอร์เฟซนั้นขึ้นอยู่กับสถานการณ์ปัจจุบัน (เช่นแพลตฟอร์ม / OS) หรือบนไฟล์กำหนดค่า
ToolmakerSteve

คำตอบ:


131

คุณไม่สามารถ สิ่งที่ดีที่สุดต่อไปที่คุณสามารถทำคือมีusingการประกาศในแฟ้มที่ใช้ในชั้นเรียน

ตัวอย่างเช่นคุณสามารถเขียนโค้ดที่ขึ้นต่อกันใหม่โดยใช้นามแฝงการนำเข้า (เสมือนtypedefแทน):

using ColorScheme = The.Fully.Qualified.Namespace.Outlook2007ColorScheme;

น่าเสียดายที่สิ่งนี้จำเป็นต้องเข้าไปในทุกขอบเขต / ไฟล์ที่ใช้ชื่อ

ฉันจึงไม่ทราบว่ากรณีนี้ใช้ได้จริงหรือไม่


9
หากสามารถไปที่ด้านบนสุดของไฟล์ที่มีคลาสดั้งเดิมได้ก็จะดีมาก แต่usingจะต้องเพิ่มไปยังรหัสเสียทั้งหมด และยังลบค่าด้วยการมีนามแฝงเดียวซึ่งช่วยให้ฉันเปลี่ยนผู้ใช้ทั้งหมดในColorSchemeคลาสที่มีอยู่ไปใช้คลาสใหม่โดยไม่มีการเปลี่ยนแปลง กล่าวอีกนัยหนึ่ง: ฉันต้องการเปลี่ยนชื่อColorSchemeคลาสเป็นคลาสอื่น
Ian Boyd

มีวิธีที่จะบรรลุเหมือนกันและเผยแพร่นามแฝงที่มีการสืบทอด กล่าวคือคลาสทั้งหมดที่ขยาย MyClass จะสามารถใช้ ColorScheme แทน Fully.Qualified ... ColorScheme โดยเพียงแค่เพิ่มคำสั่ง use ในไฟล์ต้นฉบับ MyClass?
Florian Burel

มันดีมากสำหรับกรณีของฉัน ในที่สุด C # จะหยุดวาดเส้นทางไฟล์ของฉัน
ElDoRado1239

25

คุณสามารถสร้างนามแฝงสำหรับชั้นเรียนของคุณได้โดยเพิ่มโค้ดบรรทัดนี้:

using Outlook2007ColorScheme = YourNameSpace.ColorScheme;

ไม่มีชื่อ 'ColorScheme' ในบริบทปัจจุบัน
Ian Boyd

7
คุณต้องการ Fully.Qualified.Namespace.Of.ColorScheme
Jamie Pate

ฉันคิดว่าใน C # สามารถใช้นามแฝงเฉพาะเนมสเปซ (ไม่ใช่คลาส) ด้วยวิธีนี้โดยที่ใน VB.Net คุณสามารถใช้นามแฝงเนมสเปซหรือคลาสโดยใช้Imports. ฉันผิดเหรอ?
นิค

คุณไม่จำเป็นต้องใช้ชื่อที่มีคุณสมบัติครบถ้วนหากคุณใส่usingคำสั่งไว้ในเนมสเปซเช่นเมื่อคุณต้องการนามแฝงของคลาสของคุณเอง
Elvedin Hamzagic

12

คุณต้องการ ( Factory | Singleton ) ขึ้นอยู่กับความต้องการของคุณ หลักฐานคือการทำให้รหัสไคลเอนต์ไม่จำเป็นต้องรู้ว่าจะได้รับชุดสีใด หากโทนสีควรกว้างขึ้นควรใช้ซิงเกิลตัน หากคุณอาจใช้รูปแบบอื่นในสถานการณ์ที่แตกต่างกันรูปแบบโรงงานอาจเป็นวิธีที่จะไป ไม่ว่าจะด้วยวิธีใดก็ตามเมื่อจำเป็นต้องเปลี่ยนรูปแบบสีรหัสจะต้องเปลี่ยนในที่เดียวเท่านั้น

public interface ColorScheme {
    Color TitleBar { get; }
    Color Background{ get; }
    ...
}

public static class ColorSchemeFactory {

    private static ColorScheme scheme = new Outlook2007ColorScheme();

    public static ColorScheme GetColorScheme() { //Add applicable arguments
        return scheme;
    }
}

public class Outlook2003ColorScheme: ColorScheme {
   public Color TitleBar {
       get { return Color.LightBlue; }
   }

    public Color Background {
        get { return Color.Gray; }
    }
}

public class Outlook2007ColorScheme: ColorScheme {
   public Color TitleBar {
       get { return Color.Blue; }
   }

    public Color Background {
        get { return Color.White; }
    }
}

ดูเหมือนโรงงานน้อยกว่าและมีความพยายามที่อ่อนแอกว่าในรูปแบบซิงเกิลตัน โรงงานมีแนวโน้มที่จะกำหนดพารามิเตอร์วิธีการสร้าง คุณจะมีสิ่งที่ต้องการมากกว่านี้: ColorScheme สาธารณะแบบคงที่ GetColorScheme (ตัวบอกสตริง);
OwenP

จริง - แนวคิดพื้นฐานคือเพื่อให้แน่ใจว่าเมื่อ office 2012 ออกมารหัสจะต้องเปลี่ยนเพียงที่เดียว
Chris Marasti-Georg

1
สิ่งนี้ได้ผลแน่นอน แต่แน่นอนว่าเป็นวิธีแก้ปัญหาระดับองค์กรสำหรับปัญหาง่ายๆ
Ian Boyd

11

คุณไม่สามารถเปลี่ยนชื่อคลาสใน C # ได้

มีหลายสิ่งที่คุณสามารถทำได้โดยไม่ใช้นามแฝงชื่อคลาสใน C #

แต่เพื่อตอบคำถามเดิม: คุณไม่สามารถเปลี่ยนชื่อคลาสใน C # ได้


Update:คนงงว่าทำไมusingไม่ทำงาน ตัวอย่าง:

Form1.cs

private void button1_Click(object sender, EventArgs e)
{
   this.BackColor = ColorScheme.ApplyColorScheme(this.BackColor);
}

ColorScheme.cs

class ColorScheme
{
    public static Color ApplyColorScheme(Color c) { ... }
}

และทุกอย่างใช้งานได้ ตอนนี้ฉันต้องการสร้างคลาสใหม่และใช้นามแฝง ColorScheme (เพื่อไม่ต้องแก้ไขโค้ด ):

ColorScheme.cs

using ColorScheme = Outlook2007ColorScheme;

class Outlook2007ColorScheme
{
    public static Color ApplyColorScheme(Color c) { ... }
}

โอ้ฉันขอโทษ รหัสนี้ไม่ได้รวบรวม:

ป้อนคำอธิบายภาพที่นี่

คำถามของฉันคือวิธีการตั้งชื่อชั้นเรียนใน C # มันไม่สามารถทำได้ มีหลายสิ่งที่ฉันทำได้ที่ไม่ใช่การใส่นามแฝงชื่อคลาสใน C #:

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

แต่วิธีแก้ปัญหาเหล่านี้เกี่ยวข้องกับการทำลายโค้ดที่มีอยู่: ไม่ใช่ทางเลือก

ถ้าคนขึ้นอยู่กับการมีอยู่ของColorSchemeชั้นเรียนฉันต้องคัดลอก / วางColorSchemeชั้นเรียนจริงๆ

กล่าวอีกนัยหนึ่ง: ฉันไม่สามารถเปลี่ยนชื่อคลาสใน C # ได้

สิ่งนี้แตกต่างกับภาษาเชิงวัตถุอื่น ๆ โดยที่ฉันสามารถกำหนดนามแฝง:

ColorScheme = Outlook2007ColorScheme

และฉันจะทำ


22
คุณสามารถแทนชื่อคลาสใน C # ได้อย่างแน่นอน "ใช้ <alias_name> = <fully_qualified_name>;"
clemahieu

8
LIke @clemahieu กล่าวว่าคุณสามารถใช้นามแฝงชื่อชั้นเรียนได้อย่างแน่นอนคุณต้องใช้ชื่อที่มีคุณสมบัติครบถ้วน นอกจากนี้หากนามแฝงของคุณเป็นคลาสทั่วไปคุณสามารถเพิ่มตัวระบุคลาสทั่วไปได้ ตัวอย่างเช่นใช้ ShortName = MyNamespace.SubNamespace.GenericClass <MyType>;
Dan Morphis

11
Downvote - คุณระบุว่า "คุณไม่สามารถเปลี่ยนชื่อคลาสใน C # ได้" คุณสามารถ. สิ่งที่คุณทำไม่ได้คือใช้นามแฝงคลาสในแบบที่คุณต้องการซึ่งเป็นข้อกำหนดที่ค่อนข้างสมเหตุสมผล แต่คำสั่งของคุณไม่ถูกต้อง
Tom W

8
ตามที่ผู้โพสต์หลายคนชี้ให้เห็นว่าการต้องใช้ชื่อที่มีคุณสมบัติเหมาะสมไม่ได้ห้ามการใช้นามแฝง คุณสามารถตั้งชื่อแทนชั้นเรียนได้ คุณต้องใช้ชื่อที่มีคุณสมบัติครบถ้วนจึงจะทำได้ คุณอาจพบว่าสิ่งนี้ไม่สะดวก แต่ก็ไม่ได้ทำให้คำสั่ง 'คุณไม่สามารถแทนชื่อคลาสใน C #' เป็นจริงได้ บางทีวิธีการทำงานของนามแฝงใน C # อาจแตกต่างจากที่คุณคาดหวัง ไม่เป็นไร - ถ้าเป็นเช่นนั้นให้ระบุว่า แต่คุณสามารถเปลี่ยนชื่อคลาสใน C # ได้เนื่องจากข้อกำหนดระบุว่าคุณสามารถทำได้ตามคำจำกัดความที่ระบุ
Tom W

5
ฉันชอบวิธีที่โปรแกรมเมอร์เขียนข้อความระหว่างบรรทัด สิ่งที่เอียนพูดจริงๆคือ C # เป็นใบ้และพังเพราะมันไม่สามารถทำสิ่งพื้นฐานง่ายๆที่ใคร ๆ ก็อยากทำและควรจะทำได้ เขาถูกต้อง - ความหมายเฉพาะที่ทำให้คุณมีความสุขหรือไม่
IQpierce

10

ลองสิ่งนี้:

using ColorScheme=[fully qualified].Outlook2007ColorScheme

ไม่มีชื่อ 'ColorScheme' ในบริบทปัจจุบัน
Ian Boyd

2
คุณต้องการ Fully.Qualified.Namespace.Of.ColorScheme
Jamie Pate

6

ฉันกำลังเพิ่มความคิดเห็นนี้สำหรับผู้ใช้ที่พบสิ่งนี้นานหลังจากที่ OP ยอมรับ "คำตอบ" ของพวกเขา นามแฝงใน C # ทำงานโดยการระบุชื่อคลาสโดยใช้เนมสเปซแบบเต็ม หนึ่งที่กำหนดชื่อนามแฝงสามารถใช้ภายในขอบเขตได้ ตัวอย่าง.

using aliasClass = Fully.Qualified.Namespace.Example;
//Example being the class in the Fully.Qualified.Namespace

public class Test{

  public void Test_Function(){

    aliasClass.DoStuff();
    //aliasClass here representing the Example class thus aliasing
    //aliasClass will be in scope for all code in my Test.cs file
  }

}

ขออภัยสำหรับรหัสที่พิมพ์เร็ว แต่หวังว่าจะอธิบายถึงวิธีการใช้งานสิ่งนี้เพื่อไม่ให้ผู้ใช้เข้าใจผิดว่าไม่สามารถทำได้ใน C #


นี้จะเป็นที่ชัดเจนมากขึ้นถ้าคุณแสดงให้เห็นว่าการประกาศของชั้นอื่น ๆ namespace Fully.Qualified.Namespace{ public class Example {... public void DoStuff(){... ...} } }
ToolmakerSteve

1
เพื่อความชัดเจนนี่แตกต่างจากสิ่งที่เอียนกำลังมองหา เอียนมีสถานการณ์ที่เขาไม่สามารถ (หรือไม่ต้องการ) แก้ไขไฟล์ต้นฉบับที่อ้างถึงคลาสได้ เขาต้องการวิธีทำการเปลี่ยนแปลงในที่เดียวในแอปพลิเคชันหรือไลบรารีของเขาทำให้สิ่งที่ดูเหมือนจะเป็นคลาสที่มีชื่อที่ต้องการซึ่งโค้ดอื่น ๆ ทั้งหมดสามารถใช้ได้ [โดยไม่ต้องเพิ่มคำสั่ง "ใช้" นั้นไปยังแหล่งที่มาหลายแหล่ง ไฟล์ - ตัวอย่างเช่นแหล่งที่มานั้นอาจไม่สามารถแก้ไขได้]
ToolmakerSteve

4

การใช้นามแฝงในแบบที่คุณต้องการจะใช้ไม่ได้ใน C # เนื่องจากการตั้งนามแฝงทำผ่านusingคำสั่งซึ่ง จำกัด เฉพาะไฟล์ / เนมสเปซที่เป็นปัญหา หากคุณมีไฟล์ 50 ไฟล์ที่ใช้ชื่อคลาสเก่านั่นหมายความว่าต้องอัปเดต 50 แห่ง

ที่กล่าวว่าฉันคิดว่ามีวิธีง่ายๆที่จะทำให้โค้ดของคุณเปลี่ยนแปลงน้อยที่สุด ทำให้ColorSchemeชั้นเรียนเป็นส่วนหน้าสำหรับการเรียกของคุณไปยังชั้นเรียนจริงด้วยการใช้งานและใช้usingในไฟล์นั้นเพื่อพิจารณาว่าColorSchemeคุณใช้อะไร

กล่าวอีกนัยหนึ่งให้ทำดังนี้

using CurrentColorScheme = Outlook2007ColorScheme;
public static class ColorScheme
{
   public static Color ApplyColorScheme(Color c)
   {
       return CurrentColorScheme.ApplyColorScheme(c);
   }
   public static Something DoSomethingElse(Param a, Param b)
   {
       return CurrentColorScheme.DoSomethingElse(a, b);
   }
}

จากนั้นในโค้ดของคุณด้านหลังไม่ต้องเปลี่ยนแปลงอะไรเลย:

private void button1_Click(object sender, EventArgs e)
{
   this.BackColor = ColorScheme.ApplyColorScheme(this.BackColor);
}

จากนั้นคุณสามารถอัปเดตค่าได้ColorSchemeโดยการอัปเดตโค้ดหนึ่งบรรทัด ( using CurrentColorScheme = Outlook2008ColorScheme;)

ข้อกังวลสองประการที่นี่:

  • จากนั้นทุกเมธอดหรือนิยามคุณสมบัติใหม่จะต้องถูกเพิ่มในสองตำแหน่งในColorSchemeคลาสและในOutlook2007ColorSchemeคลาส นี่เป็นงานพิเศษ แต่ถ้าเป็นรหัสเดิมจริงก็ไม่ควรเกิดขึ้นบ่อยๆ ในฐานะโบนัสรหัสในColorSchemeนั้นง่ายมากจนข้อผิดพลาดที่เป็นไปได้นั้นชัดเจนมาก
  • การใช้คลาสคงที่นี้ดูไม่เป็นธรรมชาติสำหรับฉัน ฉันอาจจะพยายาม refactor รหัสเดิมเพื่อทำสิ่งนี้แตกต่างออกไป แต่ฉันก็เข้าใจเช่นกันว่าสถานการณ์ของคุณอาจไม่อนุญาต
  • หากคุณมีColorSchemeคลาสที่กำลังจะเปลี่ยนวิธีนี้และวิธีอื่น ๆ อาจเป็นปัญหาได้ ผมจะแนะนำให้คุณเปลี่ยนชื่อชั้นเรียนที่เพื่อสิ่งที่ต้องการและจากนั้นเข้าถึงได้ผ่านทางColorSchemeOldusing CurrentColorScheme = ColorSchemeOld;

3

ฉันคิดว่าคุณสามารถสืบทอดจากคลาสพื้นฐานได้ตลอดเวลาโดยไม่มีอะไรเพิ่ม

public class Child : MyReallyReallyLongNamedClass {}

อัปเดต

แต่ถ้าคุณมีความสามารถในการปรับโครงสร้างclassตัวเองใหม่ชื่อคลาสมักจะยาวโดยไม่จำเป็นเนื่องจากไม่มีnamespaces

ถ้าคุณเห็นกรณีApiLoginUser, DataBaseUser, WebPortalLoginUser, มักจะเป็นข้อบ่งชี้ของการขาดnamespaceเนื่องจากกลัวว่าชื่อUserความขัดแย้งอาจ

อย่างไรก็ตามในกรณีนี้คุณสามารถใช้namespaceนามแฝงได้ตามที่ระบุไว้ในโพสต์ด้านบน

using LoginApi = MyCompany.Api.Login;
using AuthDB = MyCompany.DataBase.Auth;
using ViewModels = MyCompany.BananasPortal.Models;

// ...
AuthDB.User dbUser;
using ( var ctxt = new AuthDB.AuthContext() )
{
    dbUser = ctxt.Users.Find(userId);
}

var apiUser = new LoginApi.Models.User {
        Username = dbUser.EmailAddess,
        Password = "*****"
    };

LoginApi.UserSession apiUserSession = await LoginApi.Login(apiUser);
var vm = new ViewModels.User(apiUserSession.User.Details);
return View(vm);

หมายเหตุว่าclassชื่อมีทั้งหมดUserแต่ในที่แตกต่างกันnamespaceของ การอ้างอิงPEP-20: Zen of Python :

เนมสเปซเป็นแนวคิดที่ยอดเยี่ยมอย่างหนึ่ง - มาทำสิ่งเหล่านั้นให้มากขึ้น!

หวังว่านี่จะช่วยได้


2
เสมอเว้นแต่คุณจะทำไม่ได้เช่นคลาสปิดผนึก
mikus

แต่จะไม่ได้ผลในหลาย ๆ กรณี เช่นคลาสสาธารณะ MyList: รายการ {} - หากคุณลองใช้ MyList xyz = something ToList () ในภายหลัง คุณจะติด
Offler

@Offler คุณสามารถ (และน่าจะ) ใช้newคีย์เวิร์ดอย่างใดอย่างหนึ่งสำหรับวิธีการดังกล่าวหรือแม้แต่สร้างวิธีการขยายของคุณเองใช่ไหม ไม่ว่าในกรณีใดฉันคิดว่าคุณควรใช้คลาส vanilla Collection เสมอ (เช่น Dictionary, List, IEnumerable, IQueryable ฯลฯ ) กับ Models / ViewModels / POCO ที่กำหนดเอง ตามที่ Mvc ระบุ: Convention over Configuration
รู้

@percebus ไม่ได้ผลในทุกกรณี ฉันพยายามเปลี่ยนรหัสวินเทจโดยที่ส่วนต่างๆใช้ api ที่ไม่รองรับให้เป็นส่วนที่ใหม่กว่าอีกต่อไป รหัสการแปลง durign จะถูกเปลี่ยนโดยผู้อื่นและควรยังใช้งานได้ - ดังนั้นทั้งสองควรใช้งานได้ในตอนนี้ การแปลงสิ่งต่างๆมากกว่า 700.000 LOC (โดยไม่มีความคิดเห็น) และยังคงปล่อยให้รันได้จะง่ายกว่าถ้านามแฝงสไตล์ c ++ เป็นไปได้ - และคุณต้องการเพียงที่เดียวในไฟล์เพื่อแทนที่คลาสนามแฝงด้วยการใช้งานจากอย่างใดอย่างหนึ่ง
Offler

RE-POST for EDIT @Offler สำหรับสิ่งที่คุณกำลังอธิบายเสียงที่คุณต้องการบางอย่างเช่นโรงงานที่มีอินเทอร์เฟซ IColorScheme oColorScheme = ColorSchemeFactory.Create(); นอกจากนี้คุณอาจต้องการตรวจสอบDependency Injection
รู้

2

สามารถเปลี่ยนไปใช้อินเทอร์เฟซได้หรือไม่?

บางทีคุณอาจสร้างIColorSchemeอินเทอร์เฟซที่ทุกคลาสใช้งานได้?

สิ่งนี้ใช้ได้ดีกับรูปแบบโรงงานดังที่แสดงโดย Chris Marasti-Georg


อาจเป็นได้ แต่ฉันจะไม่ใช้เวลากับมันอีกต่อไปแทนที่จะเปลี่ยนชื่อคลาสที่เป็นโทนสี "ปัจจุบัน" ที่จะใช้
Ian Boyd

0

มันเป็นคำตอบบางส่วนที่ช้ามาก แต่ถ้าคุณกำหนดคลาสเดียวกัน 'ColorScheme' ในเนมสเปซเดียวกัน 'Outlook' แต่ในแอสเซมบลีที่แยกจากกันอันที่เรียกว่า Outlook2003 และ Outlook2007 อื่น ๆ สิ่งที่คุณต้องทำคืออ้างอิงแอสเซมบลีที่เหมาะสม .

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