如何使通用的linq表达式更加“通用”

本文关键字:通用 表达式 何使通 linq | 更新日期: 2023-09-27 18:04:32

我有以下类的表达式属性:

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

我需要一个表达式能够处理SomeAbstractBaseClass的所有子类和所有类型的属性选择器(int, string, decimal等)。最后,表达式将传递给linq扩展方法,如OrderBy。目前,它将我锁定在只出现在基类上的属性中。object道具选择器是有问题的,当试图通过任何东西,但一个字符串的道具。

我可以接受…

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

…但是没有什么强制要求表达式必须基于SomeAbstractBaseClass的子类。此外,我不确定如何将这样的表达式传递到OrderBy扩展方法中。

任何帮助都将是感激的,即使它是一个完全改变方向。:) 编辑:

对不起,我之前没有提到,但是我不能使用泛型来解决这个问题。不幸的是,我不知道编译时的类型。

如何使通用的linq表达式更加“通用”

使用泛型类型约束:
public class ClassWithExpression<T> where T : SomeAbstractBaseClass
{
    public Expression<Func<T, object>> SomeExpression { get; set; }
}

你能这样做吗?

private Expression<Func<SomeAbstractBaseClass, object>> SomeExpression;
public void SetExpression<T>(Expression<Func<T, object>> expression)
    where T : SomeAbstractBaseClass
{
    SomeExpresssion = expression;
}