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();
왜 이런 일이 발생하는지 알고 있습니까? 명시 적으로 구현 된 인터페이스로 작업하는 더 좋은 방법이 있습니까?
자신 만의 질문에 답하는 데 아무런 해가 없습니다. 스택 오버 플로우의 절반 정도가 다음 사람이 궁금해하는 답변의 원천입니다! –