【问题标题】:How to assigning a Expression of <T> in a Expression of object?如何在对象的表达式中分配 <T> 的表达式?
【发布时间】:2013-12-17 16:41:01
【问题描述】:

这将非常简单。

public class ModelMapNode { }

public class ModelMapNode<TModelMap> : ModelMapNode { }

public class ModelMapView { }

public class ModelMapView<TModelMap> : ModelMapView
    where TModelMap : ModelMapNode
{
    public ModelMapView()
    {
        this.RemovedProperties = new List<Expression<Func<TModelMap, object>>>();
    }

    public List<Expression<Func<TModelMap, object>>> RemovedProperties { get; private set; }

    public void RemoveNode<TNodeModelMap>(Expression<Func<TModelMap, TNodeModelMap>> expression)
        where TNodeModelMap : ModelMapNode
    {
        this.RemovedProperties.Add(expression);
    }
}

理论上,可以在对象中分配任何泛型类型。但是按照我的方式,分配是无效的。

我无法在 Expression&lt;Func&lt;T, object&gt;&gt; 中分配 Expression&lt;Func&lt;T, T2&gt;&gt;

有可能吗?

【问题讨论】:

  • 这行不通。 Expression&lt;&gt; 是类,不是接口,所以不支持协方差。您可以将 RemotedProperties 改为 List 吗?
  • @CoryNelson 在我的情况下,不可能使用 List

标签: c# .net expression expression-trees assign


【解决方案1】:

我不确定您要在这里完成什么(您尚未解释为什么需要存储比通过 API 公开的类型更弱的类型),但要按要求回答您的问题,您可以执行以下操作:

Expression<Func<TModelMap, TNodeModelMap>> source = ...

var convertedBody = Expression.Convert(source.Body, typeof(object));    

var convertedExpression = Expression.Lambda<Func<TModelMap, object>>
                          (convertedBody, source.Parameters);

RemovedProperties.Add(convertedExpression);

【讨论】:

  • 这个不完全是我的用例,它非常具体,在这里解释起来会很复杂。无论如何,你的答案正是我所需要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
相关资源
最近更新 更多