Получение члена через строку в C #? - PullRequest
3 голосов
/ 17 ноября 2009

Мой вопрос проистекает из MVC SelectList (и предыдущих поколений). По сути, класс принимает IEnumerable и использует члены, которые вы определили как строки.

  1. Как он взаимодействует с объектом (литье, отражение?)
  2. (возможно, избыточно). Как выглядит член в виде строки.

Это один аспект C #, который меня интересовал, но никогда не мог найти примеров: (


EDIT

В итоге я использовал DataBinder.Eval () из System.Web.UI

Он все еще имеет издержки на отражение, но упрощает задачу, позволяя вам передать объект и строку, содержащую иерархию нужного вам члена. Прямо сейчас это не очень много значит, но этот проект был разработан для сбора данных Linq, поэтому отсутствие необходимости беспокоиться об этом в будущем сделает мою жизнь немного проще.

Спасибо всем за помощь.

Ответы [ 2 ]

4 голосов
/ 17 ноября 2009

Хотя я точно не знаю о его реализации, я ожидаю, что он будет использовать отражение.

Обычно вы вызываете Type.GetProperty или Type.GetMethod, чтобы получить соответствующий элемент, а затем запрашиваете значение этого свойства для конкретного экземпляра (или вызываете метод, так далее). В качестве альтернативы есть Type.GetMembers, Type.GetMember и т. Д.

Если вы хотите иметь возможность использовать «Person.Mother.Name» или аналогичные «пути», вы должны выполнять этот анализ самостоятельно, насколько я знаю. (Могут быть кусочки фреймворка, чтобы сделать это за вас, но они не в API отражения.)

Вот короткий, но полный пример:

using System;
using System.Reflection;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Test    
{
    static void Main()
    {
        Person jon = new Person { Name = "Jon", Age = 33 };
        ShowProperty(jon, "Name");
        ShowProperty(jon, "Age");
    }

    static void ShowProperty(object target, string propertyName)
    {
        // We don't need no stinkin' error handling or validity
        // checking (but you do if you want production code)
        PropertyInfo property = target.GetType().GetProperty(propertyName);
        object value = property.GetValue(target, null);
        Console.WriteLine(value);
    }
}
1 голос
/ 17 ноября 2009

Да, через отражение. Взгляните на класс Type и связанные с ним методы. Хорошее место для начала может быть здесь .

Вы всегда можете посмотреть на источник в MVC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...