当前位置:  开发笔记 > 编程语言 > 正文

如何在C#中为类名设置别名,而不必为每个使用该类的文件添加一行代码?

如何解决《如何在C#中为类名设置别名,而不必为每个使用该类的文件添加一行代码?》经验,为你挑选了5个好方法。

我想为类名创建一个别名.以下语法将是完美的:

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类中的静态变量可以指向"true"颜色方案:

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

private class CustomColorScheme 
{ 
   ...
}

private class Outlook2008ColorScheme : CustomColorScheme 
{
    ...
}

private class Outlook2003ColorScheme : CustomColorScheme 
{
   ...
}

但这需要我将一个由只读静态颜色组成的类转换为可覆盖的属性,然后我的ColorScheme类需要将30个不同的属性getter thunk down到包含的对象中.

打字太多了.

所以我的下一个想法是给这个类别名:

public static ColorScheme = Outlook2007ColorScheme;

但那不编译.

我如何将静态类别名改为另一个名称?


更新:有人可以添加答案"你不能在C#中做到这一点",所以我可以将其标记为已接受的答案.任何想要回答相同问题的人都会发现这个问题,接受的答案以及可能会或可能不会有用的一些变通方法.

我只想关闭这个问题.



1> Konrad Rudol..:

如果更改原始类名,则可以使用导入别名作为typedef替代来重写从属代码:

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

这必须放在文件/命名空间的顶部,就像常规的usings一样.

不过,我不知道这是否适用于你的情况.


如果它可以位于包含原始类的文件的顶部:它会很棒.但必须将`using`添加到所有损坏的代码中.并且它还否定了具有单个别名的价值,这使我可以将现有`ColorScheme`类的所有用户切换为使用新类 - 无需更改.换句话说:我想将`ColorScheme`类别名为另一个类.

2> mohammedn..:

您可以通过添加以下代码行为您的类创建别名:

using Outlook2007ColorScheme = YourNameSpace.ColorScheme;


你需要Fully.Qualified.Namespace.Of.ColorScheme

3> Chris Marast..:

你需要一个(工厂 | 单身),这取决于你的要求.前提是使客户端代码不必知道它获得的颜色方案.如果配色方案应该是应用程序范围的,单身就应该没问题.如果您可以在不同的情况下使用不同的方案,那么工厂模式可能就是您的选择.无论哪种方式,当颜色方案需要改变时,代码只需要在一个地方改变.

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



4> Ian Boyd..:

您不能在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) { ... }
}

一切正常.现在我想创建一个类,并为它创建别名 ColorScheme(这样就不需要修改代码):

ColorScheme.cs

using ColorScheme = Outlook2007ColorScheme;

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

哦,对不起.此代码无法编译:

在此输入图像描述

我的问题是如何别名在C#中的一类.它无法完成.我可以做的事情不是在C#中别名类名:

改变大家谁依赖于ColorSchemeusing ColorScheme代替(代码变化的解决方法,因为我无法别名)

改变依赖于ColorScheme使用工厂模式的每个人他们的多态类或接口(代码更改解决方法因为我不能别名)

但这些变通办法涉及破坏现有代码:不是一种选择.

如果人们依赖于ColorScheme类的存在,我必须实际复制/粘贴一个ColorScheme类.

换句话说:我不能在C#中为类名别名.

这与其他面向对象语言形成对比,我可以在其中定义别名:

ColorScheme = Outlook2007ColorScheme

我会完成的.


你绝对可以在C#中为别名命名别名."using = ;"
Downvote - 你已经说过"你不能在C#中使用别名别名." 您可以.你不能做的是按照你想要的方式别名一个类 - 这是一个非常合理的要求,但你的陈述是不正确的.
正如几张海报所指出的那样,不得不使用限定名称来禁止别名.你**可以**别名.您只需使用完全限定名称即可.您可能会觉得这很不方便,但它并没有使"您不能在C#中使用别名别名"这句话为真.也许在C#中混叠的方式与您期望的不同.那没关系 - 如果是这样的话,说明一下.但是你可以**在C#中使用别名,因为规范声明你可以根据它提供的定义这样做.
LIke @clemahieu说,你绝对可以别名一个类名,你只需要使用完全限定名.此外,如果别名是泛型类,则必须添加泛型类限定符.例如:使用ShortName = MyNamespace.SubNamespace.GenericClass ;
我喜欢程序员如何在行之间进行语句.Ian真正说的是C#是愚蠢而破碎的,因为它不能做任何人想做的应该做的简单基本的事情.他是对的 - 无论具体的语义是否让你开心.

5> dpurrington..:

试试这个:

using ColorScheme=[fully qualified].Outlook2007ColorScheme


您需要Fully.Qualified.Namespace.Of.ColorScheme
推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有