在设计时获取自己的静态实例名称

Getting the own static instance name at design-time

是否可以覆盖 ToString(),所以 class 它 returns 它自己的实例名称,当声明为静态时?

我只在设计时需要它,而不是在执行期间。

public class MyVar
{
    public override string ToString()
    {
        return MY_NAME();
    }
}

public class Vars
{
    public static MyVar a = new MyVar(); //ToString() returns "a" or "Vars.a"
    public static MyVar b = new MyVar(); //ToString() returns "b" or "Vars.b"
    public static MyVar c = new MyVar(); //ToString() returns "c" or "Vars.c"
    public static MyVar d = new MyVar(); //ToString() returns "d" or "Vars.d"
}

背景:我想在设计器的propertygrid中显示这个名字:

        this.myButton2.Text = "myButton2";
        this.myButton2.UseVisualStyleBackColor = true;
        this.myButton2.Reference = Vars.b;//Should be displayed in the PropertyGrid as "b" or "Vars.b"

没有

引用就是对实例的引用。他们没有名字。您用来存储引用的本地或字段可以有一个名称,但是除了尝试依次比较每个字段之外,没有其他方法可以从对字段的引用中获取 - 例如:

void Main()
{
  Vars.a.ToString().Dump();
  Vars.b.ToString().Dump();
  Vars.c.ToString().Dump();
  Vars.d.ToString().Dump();
}

public class MyVar
{
    public override string ToString()
    {
        var field = typeof(Vars)
                    .GetFields()
                    .Where(i => object.ReferenceEquals(i.GetValue(null), this))
                    .FirstOrDefault();

        return field == null ? "Unknown" : field.Name;
    }
}

public class Vars
{
    public static MyVar a = new MyVar(); //ToString() returns "a" or "Vars.a"
    public static MyVar b = new MyVar(); //ToString() returns "b" or "Vars.b"
    public static MyVar c = new MyVar(); //ToString() returns "c" or "Vars.c"
    public static MyVar d = new MyVar(); //ToString() returns "d" or "Vars.d"
}

但是,这肯定是一种代码味道 - 您真的不需要这样的东西。

根据您具体要做什么,可能有很多更简洁的方法。例如,您可以使用如下内容:

public class MyVar
{
  public static readonly MyVar a = new MyVar(nameof(a));
  public static readonly MyVar b = new MyVar(nameof(b));
  public static readonly MyVar c = new MyVar(nameof(c));
  public static readonly MyVar d = new MyVar(nameof(d));

  private readonly string name;
  private MyVar(string name) { this.name = name; }

  override string ToString() { return this.name; }
}

MyVar 本身无法做到这一点,因为很容易出现无法解决的情况,例如,对于以下代码 .ToString() return 会怎样:

public static MyVar a = new MyVar(); 
public static MyVar b = a;  // Should ToString() return "a" or "b"?

如果您使用的是 C#6,则 nameof 可用于 return 变量名称:

this.myButton2.Reference = nameof(Vars.b);

虽然我不清楚 Reference 是什么,所以这可能行不通。