2015-11-19 2 views
0

Возможно ли переопределить ToString(), поэтому класс возвращает свое собственное имя-экземпляр, если объявлено static?Получение собственного имени статического экземпляра во время разработки

Мне это нужно только при разработке, а не во время исполнения.

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" 
+0

Конечно, я использую перечисления очень часто, но они не помогают здесь. В настоящее время я играю с помощью CodeDomSerializer и TypeConverter, чтобы сделать его возможным для выбора статического класса в propertygrid в режиме разработки [См. Мой другой вопрос] (http://stackoverflow.com/questions/33759065/selecting-static-fields-via -dropdown-at-designtime-in-c-sharp) – drvolcano

+0

Что такое 'myButton2.Reference'? –

+0

@David: Ссылка представляет собой представление тега в S7-PLC. Я хочу создать структуру HMI для визуальной студии, а «Ссылка» используется для подключения HMI-управления к тегу в ПЛК. Он содержит все функции и данные для записи и чтения этого тега (для кнопки this wold должен быть BOOL, который установлен на preess и сбрасывается при выпуске) – drvolcano

ответ

1

No.

Ссылки только что - ссылка на экземпляр. Они не являются по названию. Локальный или поле используется для хранения ссылок может иметь имя, но нет никакого способа, чтобы получить от ссылки на другой области, чем пытаться сравнивать каждый в свою очередь, - к примеру:

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

Спасибо большое за ваше решение, это было последним часть загадки, в которой я нуждался :) – drvolcano

+0

И: вы совершенно правы, это, возможно, не лучший способ сделать что-то, но у меня есть мои причины;) – drvolcano

0

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 здесь, так что это может не сработать.

Смежные вопросы