无法检索显式接口实现的成员

本文关键字:成员 显式接口实现 检索 | 更新日期: 2023-09-27 18:07:00

我正在使用Roslyn来分析c#代码,并且在使用显式实现的接口时遇到了一个问题。给定实现接口的类型,无法按名称检索显式实现的成员。例如:

var tree = CSharpSyntaxTree.ParseText(@"
using System;
namespace ConsoleApplication1
{
    class MyClass : IDisposable
    {
        void IDisposable.Dispose()
        {
        }
        public void Dispose()
        {
        }
    }
}");
var Mscorlib = new MetadataFileReference(typeof(object).Assembly.Location); 
var compilation = CSharpCompilation.Create("MyCompilation",
    syntaxTrees: new[] { tree }, references: new[] { Mscorlib });
var model = compilation.GetSemanticModel(tree);
var myType = compilation.GetTypeByMetadataName("ConsoleApplication1.MyClass");
var dispose = myType.GetMembers("Dispose").SingleOrDefault();
//explicitDispose is null.
var explicitDispose = myType.GetMembers("IDisposable.Dispose").SingleOrDefault();

只有当类型位于名称空间中时才会出现这种情况,下面的代码工作得很好。

var tree = CSharpSyntaxTree.ParseText(@"
class MyClass : IDisposable
{
    void IDisposable.Dispose()
    {
    }
    public void Dispose()
    {
    }
}");
var Mscorlib = new MetadataFileReference(typeof(object).Assembly.Location); 
var compilation = CSharpCompilation.Create("MyCompilation",
    syntaxTrees: new[] { tree }, references: new[] { Mscorlib });
var model = compilation.GetSemanticModel(tree);
var myType = compilation.GetTypeByMetadataName("MyClass");
var dispose = myType.GetMembers("Dispose").SingleOrDefault();
//explicitDispose is not null.
var explicitDispose = myType.GetMembers("IDisposable.Dispose").SingleOrDefault();

有人知道为什么会发生这种情况吗?是否有更好的方法来处理显式实现的接口?

无法检索显式接口实现的成员

看来您需要在显式实现时提供完全限定的方法签名:

var explicitDispose = myType.GetMembers("System.IDisposable.Dispose").SingleOrDefault();

(我本来打算删掉这个问题的,但是我看到有人把它标记为收藏,所以我将提供适合我的答案)

使用typessymbol . findimplementationforinterfacemethod。

这些方法不应该"按名称"找到。