如何在C#中引用对象的名称

时间:2018-07-21 18:25:05

标签: c# .net

是否可以在C#中引用对象的名称,以避免复制

这样的无用代码
public static void Main (string[] Args)
{
     Champion aatrox = new Champion("Aatrox"); 
     Champion ahri   = new Champion("Ahri"); 
     // and so on ...
}

一直在寻找类似的东西

class Champion 
{
    public string Name { get; set; }         
    public Champion () => Name = nameOf(this);
}

但是没有找到任何办法。

3 个答案:

答案 0 :(得分:5)

如果要在对象实例中使用变量名,则不可能,也不是一个好主意。您可以在代码的不同位置使用对象实例,在该位置可以用不同的名称命名变量(或根本不像Corak pointed out那样命名变量),因此没有可用的单一名称,因此无法创建一致的逻辑

它还会在您的程序逻辑和提供给用户的字符串之间创建依赖关系-这可能会导致更多问题,例如如果名称需要包含空格,则要使用与编码约定不同的大写或小写形式,或者要将名称翻译成其他语言。

因此,有充分的理由无法实现您想要的目标。

答案 1 :(得分:1)

@CompuFreak所说的一切都是正确的,您应该将他的回答标记为已接受。

但是,您可以做的一件事是:

Champion Aatrox = new Champion (nameof(Aatrox));

这给您带来的次要优势是,如果您意识到Aatrox的拼写错误(例如,应该有两个“ x” -es),则可以重命名变量名称,该名称会渗入您的代码中。我一直都使用“ nameof”,但不确定在这里使用它。

但是,正如已经指出的那样,您不能执行所描述的操作的主要原因是,您赋予变量的名称引用了您创建的对象,而该对象本身并不是已知的。它只是您为对象引用(某些东西可以引用同一对象)提供的名称。该引用名称仅在作用域的使用位置知道。

答案 2 :(得分:0)

我不确定是否可以使用字段来完成此操作,但是可以使用CallerMemberNameAttribute使用属性来完成此操作:

class Champion {
    public string Name { get; set; }
    public Champion([CallerMemberName] string name = "") {
        Name = name;
    }
}

这会将属性名称传递给构造函数。以下将打印预期的名称“ Aatrox”和“ Ahri”:

class Program {
    static Champion Aatrox { get; set; } = new Champion();
    static Champion Ahri { get; set; } = new Champion();

    static void Main(string[] args) {
        Console.WriteLine(Aatrox.Name);
        Console.WriteLine(Ahri.Name);
        Console.ReadLine();
    }
}

如果要在不希望使用属性的地方创建类的实例,则可以将其包装在类中:

class ChampionContainer {
    public Champion Aatrox { get; set; } = new Champion();
    public Champion Ahri { get; set; } = new Champion();
}

并像这样使用它

static void Main(string[] args) {
        ChampionContainer champions = new ChampionContainer();
        Console.WriteLine(champions.Aatrox.Name);
        Console.WriteLine(champions.Ahri.Name);
        Console.ReadLine();
    }