c# - 无法检索显式接口(interface)实现的成员

标签 c# roslyn explicit-interface

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

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();

有人知道为什么会这样吗?有没有更好的方法来处理显式实现的接口(interface)?

最佳答案

在显式实现后,您似乎需要提供完全限定的方法签名:

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

(我本来打算删除这个问题,但我看到有人把它标记为收藏,所以我会提供对我有用的答案)

关于c# - 无法检索显式接口(interface)实现的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24066416/

相关文章:

c# - String.Empty 与 ""

visual-studio - Visual Studio 2015 中的 "Roslyn Code Fixes"是什么?

c# - 如何删除所有成员属性但保留空行?

c# - 为什么 List<T> 声明 GetEnumerator() 和 IEnumerable<T>.GetEnumerator()?

c# - 依赖注入(inject)和显式接口(interface)实现

c# - 为什么 RX 不在新线程上运行处理程序?

c# - 使用内置校验和创建唯一 ID?

c++ - 显式覆盖

c# - WCF 和传递 Windows 凭据

c# - 使用 Roslyn 查找所有类声明而不是从另一个类继承