C#脚本API能否无需指定类型自动推断委托参数类型?
问题:CSharpScript自动推断委托参数类型的方法
现有可正常运行的代码
string actionString = "(p1,p2)=>p1.HP-=20"; var options = ScriptOptions.Default.AddReferences(typeof(SimplePlayer).Assembly).AddImports("Player"); var script = CSharpScript.Create<Action<SimplePlayer, SimplePlayer>>(actionString, options); SimpleDeck d = new SimpleDeck(Game.GameController.Cards, 100, 100); SimplePlayer p1 = new SimplePlayer(4000, 100, 100, d); SimplePlayer p2 = new SimplePlayer(4000, 100, 100, d); var del = script.CreateDelegate(); del.DynamicInvoke(p1, p2); System.Console.WriteLine(p1.HP);
尝试的无指定委托类型的代码
我希望实现相同功能,但无需指定预期委托类型,尝试了如下代码:
string actionString = "(p1,p2)=>p1.HP-=20"; var options = ScriptOptions.Default.AddReferences(typeof(SimplePlayer).Assembly).AddImports("Player"); var script = CSharpScript.Create(actionString, options); SimpleDeck d = new SimpleDeck(Game.GameController.Cards, 100, 100); SimplePlayer p1 = new SimplePlayer(4000, 100, 100, d); SimplePlayer p2 = new SimplePlayer(4000, 100, 100, d); var del = script.CreateDelegate(); del.DynamicInvoke(p1, p2);
运行报错
error CS8917: The delegate type could not be inferred.
修改参数类型后的代码
若将代码中的actionString修改为:
string actionString = "(SimplePlayer p1,SimplePlayer p2)=>p1.HP-=20";
核心疑问
是否存在无需显式传递SimplePlayer类型作为参数,也无需执行var script = CSharpScript.Create<Action<SimplePlayer, SimplePlayer>>(actionString, options);这类操作,就能自动推断SimplePlayer类型的方法?
解答
不存在这样的自动推断方式,原因如下:
- CSharpScript在处理无显式类型声明的lambda表达式时,仅通过
p1.HP这种成员调用无法确定参数的具体类型——毕竟可能有多个类都包含HP属性,脚本引擎没有足够上下文锁定到SimplePlayer。 - 要让脚本正确识别参数类型,必须提供明确的类型信息:要么在lambda的参数列表里显式标注
SimplePlayer类型,要么在调用CSharpScript.Create时指定具体的委托类型(比如Action<SimplePlayer, SimplePlayer>)。 - 如果想减少重复代码,可以封装一个通用方法,传入参数类型来生成脚本,避免每次手动编写完整的委托类型声明,但本质上还是需要显式提供类型信息。
内容的提问来源于stack exchange,提问作者Rafael Acosta
相关产品推荐
相关产品推荐

