在设计时获取自己的静态实例名称
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
是什么,所以这可能行不通。
是否可以覆盖 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
是什么,所以这可能行不通。