2

アセンブリ内の特定の属性を持つメソッドをスキャンすることはできますか? 私は現在、Visual C++ プロジェクトに取り組んでいますが、C# でも問題ありません。特定の属性Egを持つ現在のアセンブリ内のすべてのメソッドを見つける必要があります。[XYZ]それに適用されます。何かご意見は?

4

4 に答える 4

4

これを試して。特定の属性のオブジェクトを検索します

        MemberInfo[] members = obj.GetType().GetMethods();
        foreach (MemberInfo m in members)
        {
            if (m.MemberType == MemberTypes.Method)
            {
                MethodInfo p = m as MethodInfo;
                object[] attribs = p.GetCustomAttributes(false);
                foreach (object attr in attribs)
                {
                    XYZ v = attr as XYZ;
                    if (v != null)
                        DoSomething();
                }
            }
        }
于 2012-05-09T17:57:15.767 に答える
3

私は同様のタスクにMicrosoftRoslynを使用しました。とても簡単なはずです。

サンプルコードが必要な場合はお知らせください。

そして、この投稿も見てください:http: //blog.filipekberg.se/2011/10/20/using-roslyn-to-parse-c-code-files/

リフレクションもそのために使用できます。GetCustomAttributesメソッドは、指定されたメンバーで定義されたすべての属性を返します。

了解しました。これを試してください。

this.GetType().GetMethods() 

すべてのメソッドとGetCustomAttributesをループします

それはそれであるはずです。残念ながら、妻のラップトップにVisualStudioをインストールしていません:)

于 2012-05-09T17:42:20.887 に答える
3

アセンブリへのパスを指定すると、次のようになります。

static void FindAttributes(String^ assemblyPath)
{
    Assembly^ assembly = Assembly::ReflectionOnlyLoadFrom(assemblyPath);

    for each (Type^ typ in assembly->GetTypes())
    {
        for each (CustomAttributeData^ attr 
            in CustomAttributeData::GetCustomAttributes(typ))
        {
            Console::WriteLine( "{0}: {1}", typ, attr);
        }
    }
}

これにより、使用するすべてのアセンブリがアプリケーション ドメインに読み込まれるので、毎回独自の AppDomain でこのコードを呼び出す価値があることに注意してください。

于 2012-05-09T21:19:04.400 に答える
2

リフレクションを使用してメソッドを取得し、属性を取得します

于 2012-05-09T19:48:56.570 に答える