【问题标题】:Getting the own static instance name at design-time在设计时获取自己的静态实例名称
【发布时间】:2015-11-19 20:42:48
【问题描述】:

是否可以覆盖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"
}

背景:我想在设计器的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"

【问题讨论】:

  • 当然,我经常使用枚举,但它们在这里没有帮助。我目前正在使用 CodeDomSerializer 和 TypeConverter,以便在设计时在 propertygrid 中选择一个静态类See my other question
  • 什么是myButton2.Reference
  • @David:引用是 S7-PLC 中变量的表示。我想为visual studio创建一个HMI框架,“Reference”用于将HMI控件连接到PLC中的标签。它包含用于写入和读取此标签的所有功能和数据(对于按钮,这将是 BOOL,在按下时设置并在释放时重置)
  • 引用是 MyVar 类型

标签: c# design-time


【解决方案1】:

没有。

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

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

【讨论】:

  • 非常感谢您的解决方案,这是我需要的拼图的最后一部分 :)
  • 而且:你说得完全正确,这可能不是最好的做事方式,但我有我的理由 ;)
【解决方案2】:

MyVar 本身不能这样做,因为不可能解决很容易出现的情况,例如,.ToString() 会为以下代码返回什么:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2016-10-26
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多