Имя объекта в другом объекте - PullRequest
4 голосов
/ 12 июля 2011

У меня есть класс, который называется Рецепты.У него есть свойства, которые есть у других классов.Так, например, имя свойства Fills может быть из класса PDInt, который имеет другие свойства, относящиеся к нужному мне значению.

Если я хочу установить значение свойства Fills в классе Prescription, оночто-то вроде

Prescription p = new Prescription(); p.Fills.Value = 33;

Итак, теперь я хочу взять имя свойства Fills и вставить его в свойство тега в элементе управления winform.

this.txtFills.Tag = p.Fills.GetType().Name;

Однако, когда я это делаю, я получаю базовый класс свойства, а не имя свойства.Поэтому вместо «Fills» я получаю «PDInt».

Как получить экземплярное имя свойства?

Спасибо.

Ответы [ 3 ]

7 голосов
/ 12 июля 2011

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

public static class ModelHelper
{
    public static string Item<T>(this T obj, Expression<Func<T, object>> expression)
    {
        if (expression.Body is MemberExpression)
        {
            return ((MemberExpression)(expression.Body)).Member.Name;
        }
        if (expression.Body is UnaryExpression)
        {
            return ((MemberExpression)((UnaryExpression)(expression.Body)).Operand)
                    .Member.Name;
        }
        throw new InvalidOperationException();
    }
}

используйте его как:

var name = p.Item(x=>x.Fills);

Подробнее окак работает метод, см. Дерево выражений в .Net

1 голос
/ 12 июля 2011

Проверьте этот пост, который полезен: http://handcraftsman.wordpress.com/2008/11/11/how-to-get-c-property-names-without-magic-strings/

Для этого вам нужно использовать функцию отражения .net framework.

Что-то вроде этого

Type type = test.GetType();

PropertyInfo[] propInfos = type.GetProperties();
for (int i = 0; i < propInfos.Length; i++) 
{
    PropertyInfo pi = (PropertyInfo)propInfos.GetValue(i);
    string propName = pi.Name;
}
0 голосов
/ 12 июля 2011

Вы можете получить, как это?↓

public class Prescription
{
    public PDInt Fills;
}

public class PDInt 
{
    public int Value;
}




Prescription p = new Prescription();
foreach(var x in p.GetType().GetFields())
{
    // var type = x.GetType();  // PDInt or X //Fills
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...