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();
なぜこれが起こっているのか誰にも分かりますか?明示的に実装されたインターフェイスを操作するより良い方法はありますか?