Когда использовать выражение - PullRequest
1 голос
/ 11 октября 2011

Я пытаюсь определить, что использовать ...

У меня есть требование передать IEnumerable<TSource> в функцию, которая записывает значения членов сущности в файл.Вот как выглядит IEnumerable:

var persons = new[] {
    new Person {
        RecordID = 0,
        PersonFName = "Joe",
        PersonMName = "",
        PersonLName = "Smith",
        PersonZip="75227"
    }, 
    new Person {
        RecordID = 1,
        PersonFName = "Mary",
        PersonMName = "Hada",
        PersonLName = "Lamb",
        PersonZip="75217"
    }};

Как лучше всего передать IEnumerable в функцию, которая читает каждую сущность, чтобы я мог прочитать каждое значение поля?

Я думал, что буду использовать что-то вроде:

void WriteData<TSource>(Expression<IEnumerable<Person>> expression)
{
    // do stuff
}

У меня проблемы с поиском ресурсов, объясняющих, как определить, когда следует использовать выражение, а не просто передавать IEnumerable.И затем, как мне создать выражение, которое отражает persons?

В идеале кажется, что я бы назвал WriteData следующим образом:

WriteData(persons); 

Я даже направляюсь в правильном направлении?

Ответы [ 2 ]

5 голосов
/ 11 октября 2011

Не вижу смысла использовать там дерево выражений.Если вы просто хотите получить все свойства по отражению, я предлагаю вам сделать это - деревья выражений на самом деле не помогут вам в этом.

Обратите внимание, что выбор редко бывает между Expression и IEnumerable<T>- обычно это либо между деревом выражений и делегатом, либо между IEnumerable<T> и IQueryable<T>.

0 голосов
/ 11 октября 2011

Я понятия не имею, что бы вы сделали с выражением, но это примерно то, что я бы сделал, используя отражение.

public void WriteData<T>(IEnumerable<T> objects) where T : class
{
  foreach (var obj in objects)
  {
    WriteObjectData(obj);
  }
}

private void WriteObjectData<T>(T obj) where T : class
{
    foreach (var propertyInfo in typeof(T).GetProperties())
    {
        // Use propertyInfo.GetValue to get the value from obj. 
    }
}

Вы можете указать интерфейс вместо where T:class, чтобы ограничить методыпросто ваши объекты данных, если вы хотите.

...