gpt4 book ai didi

vb.net - 以编程方式执行重载解析

转载 作者:行者123 更新时间:2023-12-02 08:17:04 25 4
gpt4 key购买 nike

有没有办法使用 System.CodeDom 或 Roslyn API 来解析代码中的重载方法调用?在运行时,我有一个方法名称和一个参数列表,我想找到编译器在编译时选择的方法。

最佳答案

正如 @SLaks 和 @just.another.programmer 所建议的那样,可以利用 C# 动态基础设施。但这确实并不简单。我盯着反编译的代码几个小时,找到了以下神奇的代码。我并不完全理解。第一步创建 Binder 类,并将参数选项设置为使用编译时类型。

在第二个神奇步骤中,使用实际参数调用绑定(bind)器。每个参数都有其值(null,当设置 UseCompileTimeType 时不使用)及其表达式。如果您知道类型而不是表达式,请使用 Expression.Parameter(yourType) 来替换它们。

    public static Expression GetInvokeMemberExpression(Expression expr, string name, Expression[] arguments)
{
var type = expr.Type;
var argTypes = arguments.Select(e => e.Type).ToArray();

// do magic #1
var binder = (DynamicMetaObjectBinder)Microsoft.CSharp.RuntimeBinder.Binder.InvokeMember(
CSharpBinderFlags.None, name,
Type.EmptyTypes, // type arguments
typeof(object),
Enumerable.Repeat(0, argTypes.Length + 1).Select(_ => CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType, null)).ToArray());

// do magic #2
var result = binder.Bind(DynamicMetaObject.Create(null, expr), arguments.Select(a => DynamicMetaObject.Create(null, a)).ToArray());

var resultMethodCall = (result.Expression as UnaryExpression).Operand as MethodCallExpression; // unwrap convert to ebject expression

var method = resultMethodCall.Method;

return resultMethodCall;
}

我在 DotVVM framework 中尝试了类似的代码,但是我还没有找到如何“注入(inject)”自定义隐式转换的方法,因此我编写了一个简单的方法重载识别函数。但我们仍然使用动态操作符。 You can find the code on github

关于vb.net - 以编程方式执行重载解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26473601/

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