首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查类是否在NRefactory中实现接口方法

如何检查类是否在NRefactory中实现接口方法
EN

Stack Overflow用户
提问于 2013-12-12 15:14:07
回答 3查看 735关注 0票数 1

我有两份档案。其中一个是类声明,另一个是接口声明。类应该实现接口。如果类实现接口方法,我如何签入NRefactory?

我应该给出更多细节。

第一个文件--例如:

代码语言:javascript
复制
class Test : IF
{
}

第二个

代码语言:javascript
复制
interface IF
{
    void Foo();
}

我必须读取这些文件并使用NRefactory进行解析。我需要检查类Test是否从接口IF实现方法。

无需编译和加载已编译程序集。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-14 18:43:46

我在NRefactory代码中找到了解决方案。为了实现我的目标,我对此进行了修改。首先,我们应该实现访问者,检查类是否实现了接口中的每个方法:

代码语言:javascript
复制
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;
        }
    }
}

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

代码语言:javascript
复制
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;
票数 3
EN

Stack Overflow用户

发布于 2013-12-12 15:17:34

使用is关键字

http://msdn.microsoft.com/en-us/library/scekt9xw.aspx

代码语言:javascript
复制
if (myObj is IMyInterface) {
 ....
}
票数 3
EN

Stack Overflow用户

发布于 2013-12-12 15:19:46

或者,您也可以使用as关键字。

代码语言:javascript
复制
class MyClass {  }
interface IInterface {  }

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

在不需要额外的引用输入的情况下,需要在事后使用该实例时使用此方法。使用is,您仍然需要做

代码语言:javascript
复制
if (instance is IInterface) 
{
    var inst = (IInterface) instance;
}

代码语言:javascript
复制
(instance as IInterface).InstanceProperty

那为什么不马上做呢。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20547187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档