- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在运行时使用表达式树构建委托(delegate):
Type type = GetType();
ParameterExpression parameterType = Expression.Parameter(type);
...
Delegate delegate = Expression.Lambda(*something*, parameterType).Compile();
我在编译时不知道方法 GetType() 返回的类型。是否可以在不使用昂贵的 DynamicInvoke() 方法的情况下调用我的委托(delegate)?
编辑:
在我的应用程序中,我有一个基本抽象类:
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>
我设法创建了一个表达式树并将其编译为每个过滤器的委托(delegate)。但我不能将它转换为 Func,因为我在编译时不知道 Frame01 类型......所以,目前,我使用我的委托(delegate)的方法 DynamicInvoke()底层方法。该应用程序将不得不处理大量对象,我担心性能问题...因此,在这个示例中,我尝试以编程方式构建 Func 对象,但我不确定这是否可行。
PS:对不起,我的英语不好......
最佳答案
我仍然不完全清楚这就是你想要的,但我认为你所需要的只是一个转换:你的表达式将有一个 Frame
类型的参数,将其转换为 Frame01
然后在上面运行你的过滤器。
在代码中:
var type = typeof(Frame01);
var param = Expression.Parameter(typeof(Frame));
var casted = Expression.Convert(param, type);
// this part will be dynamic in your actual code
var condition = Expression.LessThan(
Expression.Property(casted, "Counter6hours"), Expression.Constant(0));
var result = Expression.Lambda<Func<Frame, bool>>(condition, param)
.Compile();
这样,下面的测试就通过了:
Assert.IsTrue(result(new Frame01 { Counter6hours = -1 }));
Assert.IsFalse(result(new Frame01 { Counter6hours = 1 }));
Assert.Throws<InvalidCastException>(() => result(new Frame02()));
关于c# - 表达式树 : avoid DynamicInvoke,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13817666/
我继承了一些我想在这里理解的主要意大利面条代码(组合 C#/VB)。 这似乎是一个非常奇怪的情况,其中有两个连续调用来触发远程对象的事件,这是通过调用委托(delegate)的 DynamicInvo
我正在使用以下方式调用委托(delegate)(动态可配置服务): public void CallService (Delegate service, IContext ctx) { var
我想通过存储在列表中的方法名称来调用方法。谁能帮忙?我是 c# 新手! { delegate string ConvertsIntToString(int i); } class Program
我在运行时使用表达式树构建委托(delegate): Type type = GetType(); ParameterExpression parameterType = Expression.Par
我有一个 MulticastDelegate,它可以引用具有相同签名的多个(遗留)委托(delegate)之一。例如: public delegate void ObjectCreated(objec
我有一个 MethodCallExpression 包含这样的日期调用 DateTime.UtcNow.AddDays(-10); 我希望能够将其编译成它所代表的实际日期,但由于我使用的是 Xamar
这个问题部分是关于委托(delegate)的,部分是关于泛型的。 给定简化代码: internal sealed class TypeDispatchProcessor { private r
目前我使用的是非常慢的DynamicInvoke。仍在使用 Delegate 类型如何在没有后期绑定(bind)/DynamicInvoke 的情况下直接调用 Delegate? Delegate _
我读到我应该创建和重用委托(delegate)来获取对象属性的值。 我使用这段代码来创建委托(delegate) var objParm = Expression.Parameter(prop
我在基类中有以下代码: public static void InvokeExternal(Delegate d, object param, object sender) { if (d !
我正在努力创建对私有(private)的调用 ImmutableDictionary.Add ,这让我可以利用 KeyCollisionBehavior为了更好地控制(Add 方法仅在键和值不同时抛出
DynamicInvoke 和 DynamicInvokeImpl 的文档说: Dynamically invokes (late-bound) the method represented by t
为什么这行不通? namespace InvokeTest { public class MethodInvoker { public static void Exec
是否可以动态地创建方法的委托(delegate)来柯里化(Currying)一些参数(并且不需要表达式的编译和 DynamicInvoke)? 使用 DynamicInvoke 调用柯里化(Curry
我有一个类(class),用户。 Users 有一个 UserId 属性。 我有一个看起来像这样的方法: static IQueryable FilterById(this IQueryable p,
假设我有一个名为 Poll 的表,我想编写一个 LINQ 扩展来列出 ID 属于一个数组的所有民意调查。例如: void Main() { long[] ids = new long[]{ 1
为什么... Func> table = () => CampaignCodePaths; Func propertySelector = e => e.Id; int key = 1; Func w
我是一名优秀的程序员,十分优秀!