gpt4 book ai didi

.net - 使用内部委托(delegate)类型编译 lambda 表达式

转载 作者:行者123 更新时间:2023-12-01 19:26:35 26 4
gpt4 key购买 nike

如果委托(delegate)类型是内部,我在为 F# 中的属性 getter 编译 lambda 表达式时遇到一些问题。该函数如下所示:

// if I omit the 'internal' here everything works as expected
module internal ReflectionHelpers =

open System
open System.Linq.Expressions
open System.Reflection

// it makes no difference if this delegate type is defined outside
// of the module and marked as 'internal'
type GetterFunc<'T> = delegate of 'T -> obj

/// Build a getter expression function for the
/// specified PropertyInfo
let getGetter<'a> (p : PropertyInfo) =
let inst = Expression.Parameter(p.DeclaringType, "i")
let prop = Expression.Property(inst, p)
let conv = Expression.Convert(prop, typeof<obj>)
Expression.Lambda<GetterFunc<'a>>(conv, inst).Compile()

如果我使用公共(public)类调用此方法,我会得到如下异常(仅当 ReflectionHelpers 模块定义为“内部”时):

System.ArgumentNullException was unhandled by user code
Message=Value cannot be null.
Parameter name: key
Source=mscorlib
ParamName=key
StackTrace:
at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
at System.Dynamic.Utils.CacheDict`2.TryGetValue(TKey key, TValue& value)
at System.Dynamic.Utils.TypeExtensions.GetParametersCached(MethodBase method)
at System.Linq.Expressions.Expression.ValidateLambdaArgs(Type delegateType, Expression& body, ReadOnlyCollection`1 parameters)
at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerable`1 parameters)
at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, Boolean tailCall, IEnumerable`1 parameters)
at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, ParameterExpression[] parameters)
...

可能我在这里遗漏了重要的一点,但目前我看不出发生这种情况的任何原因。

最佳答案

F# 和 C# 使用不同的策略为委托(delegate)发出 Invoke 方法。如果您尝试在 C# 中定义类似的委托(delegate),委托(delegate)类型将是内部的,但具有公共(public) Invoke 方法。 F# 定义 Invoke 方法,其可见性与声明类型相同。当 Expression.Lambda 中的代码尝试在给定委托(delegate)类型中查找 Invoke 方法时,它仅查找公共(public)方法,假设所有编译器的行为都与 C# 类似

关于.net - 使用内部委托(delegate)类型编译 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10807650/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com