我如何在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这个问题。
如果更改原始类名称,则可以使用导入别名作为typedef
replace来重写相关代码:
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
类名通常不必要的长。
如果您看到ApiLoginUser
, DataBaseUser
, WebPortalLoginUser
,通常表示缺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,则只需引用适当的程序集。