我在运行时使用表达式树来构建委托:
Type type = GetType();
ParameterExpression parameterType = Expression.Parameter(type);
...
Delegate delegate = Expression.Lambda(*something*, parameterType).Compile();
我在编译时不知道 GetType() 方法返回的类型。是否可以在不使用昂贵的 DynamicInvoke() 方法的情况下调用我的委托?
编辑 :
在我的应用程序中,我有一个基本抽象类:
public abstract class Frame
{
public string RawContent { get; set; }
// ...
}
在运行时,应用程序将使用一些继承 Frame 的对象;这些对象的类型在编译时是未知的,因为它们将使用 MEF(插件)加载。应用程序的目标是过滤带有错误数据的对象:例如,如果程序必须处理像这样的类的某些对象:
public class Frame01 : Frame
{
public int Counter6hours { get; set; }
public int DeltaCounter6hours { get; set; }
}
我希望我的用户能够在应用程序的配置文件中编写如下内容:
<filtersSection>
<filters>
<filter class="Frame01" expression="Counter6hours < 0" />
<filter class="Frame01" expression="DeltaCounter6hours > 2500" />
</filters>
<filtersSection>
我设法创建一个表达式树并将其编译为每个过滤器的委托。但是我不能将它转换为 Func 因为我在编译时不知道 Frame01 类型......所以,目前,我使用我的委托的 DynamicInvoke() 方法,它以后期绑定的方式调用底层方法。该应用程序将不得不处理大量对象,而且我担心性能问题......所以,在这个例子中,我试图以编程方式构建一个 Func 对象,但我不确定它是否可能。
PS:对不起,我的英语不好...