Вопрос по c# – Как выполнить операции отражения с помощью Roslyn

3

Я хотел бы выполнить операции стиля отражения в следующем классе, используя Roslyn:

public abstract class MyBaseClass
{
    public bool Method1()
    {
        return true;
    }
    public bool Method2()
    {
        return true;
    }
    public void Method3()
    {
    }
}

В основном я хочу сделать это, но с Roslyn:

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);
    }
}

По сути, я хотел бы получить список методов, которые соответствуют критериям, которые я использовал в приведенном выше примере отражения. Кроме того, если кто-то знает сайт, который объясняет, как выполнять Reflection, например, операции с Roslyn, пожалуйста, не стесняйтесь указывать мне в этом направлении. Я искал часы и не могу добиться прогресса в этом.

Заранее спасибо,

боб

Ваш Ответ

2   ответа
5

    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;
    }

Для этого вам понадобится SyntaxTree. С учетом того, что вы работаете со сборками, я не знаю ответа на эту часть вашего вопроса. Если вы хотите это как расширение Roslyn для Visual Studio, то это должно быть то, что вы ищете.

Да, это именно то, что я искал. Спасибо! Я попробую сегодня вечером и посмотрю, как это получится. Beaker
Да, это именно то, что мне нужно. Спасибо! Beaker
0

я предлагаю начать с документов по синтаксису и семантике, которые устанавливаются вместе с Roslyn CTP. Они указывают большинство, если не все это.

Я прочитал каждый документ, который Microsoft выпустила для Roslyn. Мне было просто трудно собрать всю эту разрозненную информацию в код, который работает по конкретному сценарию, о котором я спрашивал. Beaker

Похожие вопросы