在设计时获取自己的静态实例名称
本文关键字:静态 实例 自己的 获取 | 更新日期: 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
在这里是什么,所以这可能不起作用。