Лучший способ передать список имен свойств в виде лямбда-выражений - PullRequest
9 голосов
/ 17 февраля 2012

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

public class MyDummyClass<T>
{
    public MyDummyClass(Expression<Func<T, object>> property)
    {
        ...
    }
    ...
}

.. и затем использовать этот класс как new MyDummyClass<Person>(x=>x.Name), верно?

Но тогда я бы хотел передать не только одно свойство, носписок свойств.Поэтому я написал бы свой класс как

public class MyDummyClass<T>
{
    public MyDummyClass(IEnumerable<Expression<Func<T, object>>> properties)
    {
        ...
    }
    ...
}

, и я бы хотел бы использовать его как new MyDummyClass<Person>(new[] { x=>x.Name, x=>x.Surname }), но, к сожалению, не работает !Вместо этого я должен написать

new MyDummyClass<Person>
     (new Expression<Func<Person, object>>[] { x=>x.Name, x=>x.Surname});

Но это немного неловко, не так ли?Конечно, можно использовать params , но это всего лишь пример из более сложного фрагмента кода, где с использованием params не является опцией . Кто-нибудь имеет лучший вариант , чтобы выйти из этого ??

Ответы [ 2 ]

7 голосов
/ 17 февраля 2012

Попробуйте использовать params вместо:

public MyDummyClass(params Expression<Func<T, object>>[] properties)

Тогда вы должны быть в состоянии сделать:

var dummy = new DummyClass<Person>(x => x.Name, x => x.Surname);
3 голосов
/ 18 февраля 2012

Вы можете попробовать:

public class MyDummyClass<T>
{
    public MyDummyClass(Expression<Func<T, object>> expression)
    {
        NewArrayExpression array = expression.Body as NewArrayExpression;
        foreach( object obj in ( IEnumerable<object> )( array.Expressions ) )
        {
            Debug.Write( obj.ToString() );
        }
    }
}

И тогда вы бы назвали это так:

MyDummyClass<Person> cls = new MyDummyClass<Person>( item => new[] { item.Name, item.Surname } );

Проблема в том, что это не даст вам значение свойства, потому что нетфактический экземпляр Person, указанный в нем. Выполнение ToString для "obj" даст вам имя свойства.Я не знаю, если это то, что вы ищете, но это может быть отправной точкой.

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