2013-12-12 72 views
1

我有两个文件。其中一个是类声明,另一个是接口声明。类应该实现接口。如果类实现接口方法,如何检查NRefactory?如何检查一个类是否实现NRefactory中的接口方法

我应该提供更多细节。

第一个文件 - 例如:

class Test : IF 
{ 
} 

和第二

interface IF 
{ 
    void Foo(); 
} 

我要读这些文件并NRefactory解析。我需要检查类Test是否从IF接口实现方法。

没有编译和加载编译程序集。

回答

3

我在NRefactory代码中找到解决方案。为了实现我的目标,我修改了这个。首先,我们应该实现游客这是否类实现从接口的每个方法:

public class MissingInterfaceMemberImplementationVisitor : DepthFirstAstVisitor 
{ 
    private readonly CSharpAstResolver _resolver; 
    public bool IsInterfaceMemberMissing { get; private set; } 
    public MissingInterfaceMemberImplementationVisitor(CSharpAstResolver resolver) 
    { 
     _resolver = resolver; 
     IsInterfaceMemberMissing = false; 
    } 

    public override void VisitTypeDeclaration(TypeDeclaration typeDeclaration) 
    { 
     if (typeDeclaration.ClassType == ClassType.Interface || typeDeclaration.ClassType == ClassType.Enum) 
      return; 
     base.VisitTypeDeclaration(typeDeclaration); 
     var rr = _resolver.Resolve(typeDeclaration); 
     if (rr.IsError) 
      return; 
     foreach (var baseType in typeDeclaration.BaseTypes) 
     { 
      var bt = _resolver.Resolve(baseType); 
      if (bt.IsError || bt.Type.Kind != TypeKind.Interface) 
       continue; 
      bool interfaceMissing; 
      var toImplement = ImplementInterfaceAction.CollectMembersToImplement(rr.Type.GetDefinition(), bt.Type, false, out interfaceMissing); 
      if (toImplement.Count == 0) 
       continue; 

      IsInterfaceMemberMissing = true; 
     } 
    } 
} 

现在我们要读所有的文件,解析它们并以下列方式调用上面的类:

var solutionFiles = new List<FileInfo>(); 
var trees = new Dictionary<FileInfo, SyntaxTree>(); 
IProjectContent projectContent = new CSharpProjectContent(); 
foreach (var file in solutionFiles.Where(f => f.Extension == ".cs").Distinct()) 
{ 
    var parser = new ICSharpCode.NRefactory.CSharp.CSharpParser(); 
    SyntaxTree syntaxTree; 
    using (var fs = new FileStream(file.FullName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.SequentialScan)) 
    { 
     syntaxTree = parser.Parse(fs, file.FullName); 
    } 
    trees.Add(file, syntaxTree); 
    var unresolvedFile = syntaxTree.ToTypeSystem(); 
    projectContent = projectContent.AddOrUpdateFiles(unresolvedFile); 
} 
var compilation = projectContent.CreateCompilation(); 

foreach (var sharpFile in trees) 
{ 
    var originalResolver = new CSharpAstResolver(compilation, sharpFile.Value, sharpFile.Value.ToTypeSystem()); 
    var visitor = new MissingInterfaceMemberImplementationVisitor(originalResolver); 
    sharpFile.Value.AcceptVisitor(visitor); 
    if (visitor.IsInterfaceMemberMissing) 
     return false; 
    } 
return true; 
2

另外,您也可以使用关键字as

class MyClass { } 
interface IInterface { } 

MyClass instance = new MyClass(); 
var inst = instance as IInterface; 
if (inst != null) 
{ 
    // your class implements the interface 
} 

当您需要该实例后使用而无需额外的参考键入时使用此功能。使用is你仍然需要做

if (instance is IInterface) 
{ 
    var inst = (IInterface) instance; 
} 

(instance as IInterface).InstanceProperty 

那么为什么不这样做的时候了。

相关问题