2009-05-28 2 views
1

Как мне сделать метод, показанным ниже, чтобы вернуть имя свойстваКак получить имя собственности

public class MyClass 
{ 
private string _MyProperty = "TEST"; 

public string MyProperty 
{ 
    get { return _MyProperty; } 
    set { _MyProperty = value; } 
} 

public string GetName() 
{ 
    return _MyProperty; // <- should return "MyProperty"; 
} 

}

я не ЗАС использовать возвращение «MyProperty» поэтому любой альтернативной ?

+0

Могу ли я спросить, чего вы надеетесь достичь? – mezoid

+0

Мне нужно передать имя свойства некоторому методу, который я создаю ... в основном его отвратительное предыдущее значение назад вроде трюк. –

+0

Я понимаю, но мне любопытно, как можно использовать имя свойства для другого кода. Возможно, вместо этого это сложная проблема, ее недостаток в дизайне ... Я не могу сказать это точно, пока не узнаю, что вам нужно достичь, и если есть лучший способ. – mezoid

ответ

3

Here's подобный вопрос и ответ, который использует выражение для создания> оператора NameOf <.

+0

это способ kewl сделать это :) (в этой ссылке отображается Erik). –

+0

благодарит Эрика ... его так хороший способ добиться этого ... :) –

0

Вы не можете получить имя свойства через переменную-член - переменная просто содержит ссылку на строку, а строка не знает свойства.

Что вы можете сделать список всех свойств в класса и получить их имена.

3

В некотором смысле вам нужно определить свойство, которое вы хотите вернуть его имя ... Если есть только один, вы можете использовать это:

public string GetName() 
{ 
return this.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)[0].Name; 
} 
+1

Но если есть только одно свойство и никакая другая функциональность, использование KeyValuePair будет иметь больший смысл. :) – Rytmis

+0

Это было для простого примера, если у меня есть более одного свойства, чем ваш метод не удастся ... –

1

Как Rythmis сказал, что вы не можете получить имя свойство через переменную-член. Тем не менее, вот как перечислить все свойства в классе:

public class MyClass { 
    private string _MyProperty = "TEST"; 

    public string MyProperty { 
     get { return _MyProperty; } 
     set { _MyProperty = value; } 
    } 

    public void GetName() { 
     Type t = this.GetType(); 
     PropertyInfo[] pInfos = t.GetProperties(); 
     foreach(PropertyInfo x in pInfos) 
      Console.WriteLine(x.Name); 

    } 
} 
0

Я действительно не вижу смысла, но это может быть один подход. Ниже метод использует отражение в цикле по всем свойствам типа, получить значение для каждого свойства и использовать ReferenceEquals, чтобы проверить, ссылается ли свойство и тот же объект, как тот, запрошенной:

private string _myProperty = "TEST"; 
public string MyProperty 
{ 
    get 
    { 
     return _myProperty; 
    } 
} 

public string GetName(object value) 
{ 
    PropertyInfo[] properties = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); 
    for (int i = 0; i < properties.Length; i++) 
    { 
     object propValue = properties[i].GetValue(this, null); 
     if (object.ReferenceEquals(propValue,value)) 
     { 
      return properties[i].Name; 
     } 
    } 

    return null; 
} 

Console.WriteLine(GetName(this.MyProperty)); // outputs "MyProperty" 

Это далеко от отказоустойчивых хотя , Предположим, что класс имеет два строковых свойства: MyProperty и YourProperty. Если мы в какой-то момент сделаем так: this.MyProperty = this.YourProperty, они будут ссылаться на один и тот же строковый экземпляр, поэтому вышеупомянутый метод не может с уверенностью определить, какое свойство является нужным. Как уже написано, он вернет первый найденный в массиве.

+0

Я думал об этом :), но он потерпит неудачу, если мой класс имеет одинаковое значение для двух разных свойств ........ –

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