我需要Windows API在正在开发的类中使用许多功能。其中一些功能需要使用AddressOf,但根据Microsoft文档,禁止在类模块中使用。有人知道可以模仿AddressOf操作员的功能或某些标准方法吗,或者甚至可能吗?
示例:我正在使用该SetTimer函数在特定时间调用一个函数。您可能会说很好,您可以使用Application.OnTime。您在任何其他时间都是对的,但在这种情况下我做不到,因为用于实例化类和调用方法的调用函数是UDF从工作表中OnTime调用的,它忽略了调用。我试图避免在标准模块(该类依赖于该类的实例)中放置公共函数的笨拙实现AddressOf,尽管我可以用丑陋的方式使用它。
编辑: 如评论中所述,起初,我有意未完全透露自己在试图避免听到的“我不应该那样做”的内容,大声笑。我有一个工作类别,可以完全满足我的要求(使用的标准方法将数组返回到工作表Ctrl+Shift+Enter),但是我想尝试模拟Dynamic Array Functions目前由Excel开发团队进行Beta测试的,不需要选择范围并通过输入数组Ctrl+Shift+Enter。我知道如果我问类似“如何不从UDF将数组从UDF返回到WorkSheet之类的问题Ctrl+Shift+Enter”,每个人都会提供现有答案,并且/或者让我感到羞耻,因为我想问如何实现与excel函数方式相矛盾的东西(我会这样做别人也一样,哈)。
这样说,我还有一个类的另一个版本,该版本使用该QueryTable对象将数据放置在工作表中,并且工作原理与相似Dynamic Array Functions。我可能会在代码审查中发布每个实现,以查看如何改进它们/获得一些最稳定的实现的见解。
Private Declare Function SetTimer Lib "user32" _
(ByVal HWnd As Long, ByVal nIDEvent As Long,
ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Function Method1(varValsIn As Variant) As Variant
Dim lngWindowsTimerID As Long
'doing some …Run Code Online (Sandbox Code Playgroud) 让我先说一下,我是菜鸟,我不知道我在做什么。所以,如果有更好的方法来做到这一点,我会全力以赴。
目前,我正在处理的项目中,我需要能够将数据源强制转换为List<T>,其中T是匿名类型,并使用 lambda 表达式对其进行过滤,或动态创建 lambda 表达式,将它们保存到数据库中。我已经创建了一个System.Linq.Dynamic.Core名为的静态包装类RunTimeType,它具有允许我从某个数据源创建匿名类型的方法,然后创建List<>该匿名类型的一个。在创建anontype和之后List<anontype>,我使用现有的流畅界面来创建Expression<Func<T, bool>>. 一旦我构建Expression并编译它,我要么想执行它,要么想将其转换为字符串并将其保存到数据库、xml 文件等中,以供以后使用。
情况1:
在编译然后立即执行表达式时,我一直很好,直到这一行:
var testList = anonList.Where(castedExp).ToList();
我收到以下错误:
错误 CS1973 C# 没有名为“Where”的适用方法,但似乎具有该名称的扩展方法。扩展方法不能动态调度。考虑强制转换动态参数或在没有扩展方法语法的情况下调用扩展方法。
这是有道理的,因为filter被声明为 a dynamic,我被迫这样做,否则编译器会抱怨以下内容:
错误 CS1061“object”不包含“By”的定义,并且找不到接受“object”类型的第一个参数的可访问扩展方法“By”(您是否缺少 using 指令或程序集引用?)
案例2:
至于构建表达式,将其转换为字符串,然后编译为有效的情况Func<T,TResult>,直到这一行我都很好:
var castedExp = (Func<dynamic, bool>)compileExp;
我收到以下错误:
错误 System.InvalidCastException 'System.Func
2[<>f__AnonymousType02[System.String,System.String],System.Boolean]' 输入 'System.Func`2[System.Object,System.Boolean]'。
但是,我知道如果我不明确地强制转换为Func<dynamic, bool>,编译器会抱怨以下内容:
错误 CS1503
Argument 2: cannot convert from 'System.Delegate' to …