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

本文关键字:静态 实例 自己的 获取 | 更新日期: 2023-09-27 18:22:31

是否可以重写ToString(),使类在声明为静态时返回自己的实例名?

我只在设计时需要这个,而不是在执行过程中。

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

背景:我想在设计师的属性栏中显示这个名字:

        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()会为以下代码返回什么:

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

如果您使用的是C#,那么nameof可以用来返回变量的名称:

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

虽然我不清楚Reference在这里是什么,所以这可能不起作用。