我有两个文件。其中一个是类声明,另一个是接口声明。类应该实现接口。如果类实现接口方法,如何检查NRefactory?如何检查一个类是否实现NRefactory中的接口方法
我应该提供更多细节。
第一个文件 - 例如:
class Test : IF
{
}
和第二
interface IF
{
void Foo();
}
我要读这些文件并NRefactory解析。我需要检查类Test是否从IF接口实现方法。
没有编译和加载编译程序集。
我有两个文件。其中一个是类声明,另一个是接口声明。类应该实现接口。如果类实现接口方法,如何检查NRefactory?如何检查一个类是否实现NRefactory中的接口方法
我应该提供更多细节。
第一个文件 - 例如:
class Test : IF
{
}
和第二
interface IF
{
void Foo();
}
我要读这些文件并NRefactory解析。我需要检查类Test是否从IF接口实现方法。
没有编译和加载编译程序集。
我在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;
另外,您也可以使用关键字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
那么为什么不这样做的时候了。
这是不是答案。我不得不为编译版本做源代码。 – Krzysztof
在你的示例类中,如果Test没有实现接口,它将不会编译 – dmck
所以没关系,因为我不想编译它。我想用NRefactory检查这个。 – Krzysztof