【问题标题】:How to make generic linq expression even more "generic"如何使通用 linq 表达式更加“通用”
【发布时间】:2011-08-03 03:57:18
【问题描述】:

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

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

我需要一个能够处理SomeAbstractBaseClass 的所有子类和所有类型的属性选择器(int、string、decimal 等)的表达式。最终,表达式将被传递给像 OrderBy 这样的 linq 扩展方法。就目前而言,它将我锁定在仅出现在基类上的属性中。 object prop 选择器在尝试传入除字符串 prop 之外的任何内容时都会出现问题。

我可以接受...

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

...但没有强制表达式基于SomeAbstractBaseClass 的子类。另外,我不确定如何将这样的表达式传递给 OrderBy 扩展方法。

任何帮助都将不胜感激,即使它完全改变了方向。 :)

编辑:

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

【问题讨论】:

  • 啊,好吧,如果您在编译时不知道类型,那么您就不能真正利用强类型,对吗?恐怕你必须使用基类(或对象)。
  • 是的,越来越清楚了。
  • 我不确定它是否符合您的要求,但您可以查看dynamic
  • 我完全改变了方向。我希望我可以删除这个问题,但你们已经回答了。 :)
  • 不用担心。如果悬而未决的问题真的让您感到困扰,您可以添加自己的答案并接受它,或者将其标记以供版主注意以将其关闭

标签: c# linq expression


【解决方案1】:

使用泛型类型约束:

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

【讨论】:

  • 很抱歉之前没有提到,但是我不知道编译时的类型,所以我不能使用泛型。否则,您的答案将是正确的。
  • @Byron:对不起,什么?您在编译时不知道类型,但您希望它们在编译时得到验证?你到底想在这里做什么?
  • 没什么好,我可以向你保证。我决定退后一步,从另一个方向来解决问题。我试图做的是老式的“不可能”。
【解决方案2】:

你能做这样的事情吗?

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

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

【讨论】:

  • 很抱歉之前没有提到,但是我不知道编译时的类型,所以我不能使用泛型。否则,您的答案将是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多