如何找出 IDynamicMemberReferenceOperation 引用了哪些方法?
How to figure out which methods IDynamicMemberReferenceOperation refers to?
我的 OperationWalker
中有以下功能:
public override void VisitDynamicInvocation(IDynamicInvocationOperation operation)
{
var memberReferenceOp = (IDynamicMemberReferenceOperation)operation.Operation;
switch (memberReferenceOp.Instance.Type)
{
case INamedTypeSymbol type:
{
var memberName = memberReferenceOp.MemberName;
var members = type.GetMembers(memberName);
if (members.Length > 1)
{
// WHAT DO I DO HERE ???
}
else
{
Result.Add((IMethodSymbol)members[0]);
}
break;
}
case IDynamicTypeSymbol dynamicType:
Unresolved.Add((operation.Syntax, memberReferenceOp.MemberName));
break;
}
}
当使用动态参数调用普通类型(非动态)的方法并且可以选择具有相同名称的目标方法时,我一无所知。例如:
class A
{
public void Get(int i){}
public void Get(string s){}
public void Get(object o){}
public void Get(double s, int precision){}
}
...
dynamic x = ...;
A a;
a.Get(x)
在这种情况下,可以调用前 3 个 A.Get
方法中的任何一个,具体取决于 x
的实际类型。但不是第四种方法。
Roslyn 有没有办法获取这些信息?具体来说,在此示例中,我想获取前 3 个 Get
方法的符号。
逻辑很重要,因为需要考虑:
- 默认参数,所以只计算参数可能不够
- 类型转换
- 可见范围
- 参数数量
- 可以使用命名语法以任意顺序传递参数
将它们结合在一起,我们得到了非常重要的逻辑。 SemanticModel
或其他任何地方是否有任何内容可以帮助获得答案?
我想通了,而且很简单 - SemanticModel.GetSymbolInfo
。当有完全匹配它的Symbol
属性returns它。当有多个候选者时,例如传递的参数之一是 dynamic
,那么 属性 CandidateSymbols
包含所有选项。
我没有用扩展方法测试过,所以可能那里有差距。
我的 OperationWalker
中有以下功能:
public override void VisitDynamicInvocation(IDynamicInvocationOperation operation)
{
var memberReferenceOp = (IDynamicMemberReferenceOperation)operation.Operation;
switch (memberReferenceOp.Instance.Type)
{
case INamedTypeSymbol type:
{
var memberName = memberReferenceOp.MemberName;
var members = type.GetMembers(memberName);
if (members.Length > 1)
{
// WHAT DO I DO HERE ???
}
else
{
Result.Add((IMethodSymbol)members[0]);
}
break;
}
case IDynamicTypeSymbol dynamicType:
Unresolved.Add((operation.Syntax, memberReferenceOp.MemberName));
break;
}
}
当使用动态参数调用普通类型(非动态)的方法并且可以选择具有相同名称的目标方法时,我一无所知。例如:
class A
{
public void Get(int i){}
public void Get(string s){}
public void Get(object o){}
public void Get(double s, int precision){}
}
...
dynamic x = ...;
A a;
a.Get(x)
在这种情况下,可以调用前 3 个 A.Get
方法中的任何一个,具体取决于 x
的实际类型。但不是第四种方法。
Roslyn 有没有办法获取这些信息?具体来说,在此示例中,我想获取前 3 个 Get
方法的符号。
逻辑很重要,因为需要考虑:
- 默认参数,所以只计算参数可能不够
- 类型转换
- 可见范围
- 参数数量
- 可以使用命名语法以任意顺序传递参数
将它们结合在一起,我们得到了非常重要的逻辑。 SemanticModel
或其他任何地方是否有任何内容可以帮助获得答案?
我想通了,而且很简单 - SemanticModel.GetSymbolInfo
。当有完全匹配它的Symbol
属性returns它。当有多个候选者时,例如传递的参数之一是 dynamic
,那么 属性 CandidateSymbols
包含所有选项。
我没有用扩展方法测试过,所以可能那里有差距。