我正在使用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();
(我打算删除这个问题,但我看到有人将其标记为最喜欢的,所以我会提供适合我的答案)