3

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

なぜこれが起こっているのか誰にも分かりますか?明示的に実装されたインターフェイスを操作するより良い方法はありますか?

4

2 に答える 2

6

明示的に実装されている場合は、完全修飾されたメソッド シグネチャを提供する必要があるようです。

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

(私はこの質問を削除するつもりでしたが、誰かがお気に入りとしてマークしたので、私に合った回答を提供します)

于 2014-06-05T18:09:34.997 に答える