如何使用 Roslyn 执行反射操作
本文关键字:反射 操作 执行 Roslyn 何使用 | 更新日期: 2023-09-27 18:35:06
我想使用 Roslyn 对以下类执行反射样式操作:
public abstract class MyBaseClass
{
public bool Method1()
{
return true;
}
public bool Method2()
{
return true;
}
public void Method3()
{
}
}
基本上我想这样做,但是对于罗斯林:
BindingFlags flags = BindingFlags.Public |
BindingFlags.Instance;
MethodInfo[] mBaseClassMethods = typeof(MyBaseClass).GetMethods(flags);
foreach (MethodInfo mi in mBaseClassMethods)
{
if (mi.GetParameters().Length == 0 && mi.ReturnType == typeof(void))
{
methodInfos.Add(mi);
}
if (mi.GetParameters().Length == 0 && mi.ReturnType == typeof(bool))
{
methodInfos.Add(mi);
}
}
从本质上讲,我想获得满足我在上面反射示例中使用的标准的方法列表。 另外,如果有人知道一个网站解释了如何使用Roslyn进行反射之类的操作,请随时指出我这个方向。 我已经搜索了几个小时,似乎无法在这方面取得进展。
提前感谢,
鲍勃
获取所需的方法可以像这样完成:
public static IEnumerable<MethodDeclarationSyntax> BobsFilter(SyntaxTree tree)
{
var compilation = Compilation.Create("test", syntaxTrees: new[] { tree });
var model = compilation.GetSemanticModel(tree);
var types = new[] { SpecialType.System_Boolean, SpecialType.System_Void };
var methods = tree.Root.DescendentNodes().OfType<MethodDeclarationSyntax>();
var publicInternalMethods = methods.Where(m => m.Modifiers.Any(t => t.Kind == SyntaxKind.PublicKeyword || t.Kind == SyntaxKind.InternalKeyword));
var withoutParameters = publicInternalMethods.Where(m => !m.ParameterList.Parameters.Any());
var withReturnBoolOrVoid = withoutParameters.Where(m => types.Contains(model.GetSemanticInfo(m.ReturnType).ConvertedType.SpecialType));
return withReturnBoolOrVoid;
}
为此,您需要一个语法树。通过反射,您正在使用程序集,因此我不知道您问题的那部分的答案。如果你想把它作为Visual Studio的Roslyn扩展,那么这应该是你要找的。
Bob,我建议您从 Roslyn CTP 一起安装的语法和语义演练文档开始。 它们表明了大部分(如果不是全部)这些。