我如何在C#中别名类名?

我想创build一个类名称的别名。 以下语法将是完美的:

public class LongClassNameOrOneThatContainsVersionsOrDomainSpecificName { ... } public class MyName = LongClassNameOrOneThatContainsVersionOrDomainSpecificName; 

但它不会编译。


注意这个例子只是为了方便。 build议改变整个系统的devise,不要试图解决这个问题。 这个例子的存在或缺乏并没有改变原来的问题。

一些现有的代码依赖于静态类的存在:

 public static class ColorScheme { ... } 

此配色scheme是Outlook 2003配色scheme。 我想要引入Outlook 2007配色scheme,同时保留Outlook 2003配色scheme:

 public static class Outlook2003ColorScheme { ... } public static class Outlook2007ColorScheme { ... } 

但我仍然面临这样的事实,代码依赖于一个名为ColorScheme的静态类的存在。 我的第一个想法是创build一个ColorScheme类,我将从Outlook2003或Outlook2007下降:

 public static class ColorScheme : Outlook2007ColorScheme { } 

但是你不能从静态类下降。

我的下一个想法是创build静态的ColorScheme类,但使Outlook2003ColorScheme和Outlook2007ColorScheme类非静态。 然后,静态ColorScheme类中的静态variables可以指向“true”颜色scheme:

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

但是这将需要我将只读静态颜色组成的类转换为可覆盖的属性,然后我的ColorScheme类需要将30个不同的属性getters转换为包含的对象。

这太打字了。

所以我的下一个想法是别名class:

 public static ColorScheme = Outlook2007ColorScheme; 

但是这不能编译。

我怎样才能将静态类别别名?


更新:有人可以添加答案“你不能在C#中做这个” ,所以我可以标记为接受的答案。 任何想要回答相同问题的人都会发现这个问题,接受的答案,以及可能或可能不会有用的一些解决方法。

我只想closures这个问题。

如果更改原始类名称,则可以使用导入别名作为typedefreplace来重写相关代码:

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

这必须在文件/命名空间的顶部,就像常规using s一样。

不过,我不知道这是否可行。

您可以通过添加以下代码行来为您的class级创build一个别名:

 using Outlook2007ColorScheme = YourNameSpace.ColorScheme; 

你需要一个( Factory | Singleton ),这取决于你的要求。 前提是使客户端代码不必知道它正在获取哪种配色scheme。 如果颜色scheme应该是广泛的,单身人士应该没问题。 如果你可能在不同的情况下使用不同的scheme,工厂模式可能是一种方式。 无论哪种方式,当颜色scheme需要改变时,代码只需要在一个地方改变。

 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; } } } 

尝试这个:

 using ColorScheme=[fully qualified].Outlook2007ColorScheme 

你不能在C#中使用别名。

有些事情你可以做,不用C#中的别名类别。

但要回答原来的问题:你不能在C#中使用别名。


更新:人们很困惑为什么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) { ... } } 

一切正常。 现在我想创build一个新的类,并为其创build别名 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 

我会完成的。

别名的方式,你想这样做将无法在C#中工作。 这是因为别名是通过using指令来完成的,该指令仅限于所讨论的文件/命名空间。 如果你有50个使用旧的类名的文件,这将意味着50个地方要更新。

这就是说,我认为有一个简单的解决scheme可以使您的代码尽可能最小化。 使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); } 

然后,您可以通过更新一行代码( using CurrentColorScheme = Outlook2008ColorScheme; )来更新ColorScheme的值。

这里有一对夫妻关心:

  • 每个新的方法或属性定义都需要在两个地方添加到ColorScheme类和Outlook2007ColorScheme类中。 这是额外的工作,但如果这是真的遗留代码,它不应该是一个频繁的事件。 作为奖励, ColorScheme的代码非常简单,任何可能的bug都是非常明显的。
  • 静态类的这种使用对我来说似乎并不自然; 我可能会尝试重构遗留代码来做这个不同的事情,但我也明白,你的情况可能不会允许。
  • 如果你已经有了一个你正在replace的ColorScheme类,这个方法和其他的方法可能会成为一个问题。 我build议您将该类重命名为ColorSchemeOld ,然后using CurrentColorScheme = ColorSchemeOld;对其进行访问using CurrentColorScheme = ColorSchemeOld;

我想你总是可以从没有添加任何东西的基类inheritance

 public class Child : MyReallyReallyLongNamedClass {} 

UPDATE

但是,如果您有能力重构class本身:由于缺lessnamespace类名通常不必要的长。

如果您看到ApiLoginUserDataBaseUserWebPortalLoginUser ,通常表示缺lessnamespace因为担心名称User可能会发生冲突。

但是,在这种情况下,您可以使用namespace别名,因为它已经在上面的post中指出了

 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:Python的禅 :

命名空间是一个好主意 – 让我们做更多的!

希望这可以帮助

是否有可能改变使用界面?

也许你可以创build一个所有类实现的IColorScheme接口?

这与克里斯·马拉斯蒂格奥(Chris Marasti-Georg)所展示的工厂模式非常吻合

这是一个非常晚的部分答案 – 但是如果你在相同的命名空间“Outlook”中定义相同的类“ColorScheme”,但是在单独的程序集中,一个名为Outlook2003和另一个Outlook2007,则只需引用适当的程序集。