Как сделать универсальное выражение linq еще более «универсальным» - PullRequest
1 голос
/ 02 августа 2011

У меня есть следующий класс со свойством выражения:

public class ClassWithExpression
{
    public Expression<Func<SomeAbstractBaseClass, object>> SomeExpression { get; set; }
}

Мне нужно выражение, чтобы иметь возможность обрабатывать все подклассы SomeAbstractBaseClass и все типы селекторов свойств (int, string,десятичный и т. д.).В конце концов, выражение будет передано в метод расширения linq, например OrderBy.В существующем состоянии он блокирует свойства, отображаемые только в базовом классе.Селектор реквизита object проблематичен при попытке передать что-либо, кроме реквизита строки.

Я бы согласился с чем-то вроде ...

public class ClassWithExpression
{
    public Expression SomeExpression { get; set; }
}

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

Буду признателен за любую помощь, даже если это полное изменение направления.:)

РЕДАКТИРОВАТЬ:

Извините, я не упомянул об этом ранее, но я не могу использовать дженерики для решения этой проблемы.К сожалению, я не знаю типы во время компиляции.

Ответы [ 2 ]

0 голосов
/ 02 августа 2011

Можете ли вы сделать что-то подобное?

private Expression<Func<SomeAbstractBaseClass, object>> SomeExpression;

public void SetExpression<T>(Expression<Func<T, object>> expression)
    where T : SomeAbstractBaseClass
{
    SomeExpresssion = expression;
}
0 голосов
/ 02 августа 2011

Используйте ограничение общего типа:

public class ClassWithExpression<T> where T : SomeAbstractBaseClass
{
    public Expression<Func<T, object>> SomeExpression { get; set; }
}
...