1

一連のアセンブリを反復処理し、型とそのメタデータを検出してからコードを生成することにより、CCI-Metadata を使用してコード ジェネレーターを作成しようとしています。カスタム属性を元の型のメタデータに追加することで、コード生成を制御できるようにしたいと考えています。

何かのようなもの:

[GenerateSpecialClass(true, "foo", IsReallySpecial=false)]
public class MyClass { ... }

INamedTypeDefinition があり、Attributes プロパティから IEnumerable を取得します。ここから、カスタム属性の値とそのプロパティを取得するために何をすべきかわかりません。

誰かが私にコード サンプルを与えることができます: ICustomAttribute を指定して、例の属性から値を取得する方法。その定義が次のとおりであると仮定します。

public GenericSpecialClassAttribute : Attribute
{
    public bool Prop1 { get; set; }
    public string Prop2 {get; set; }
    public bool IsReallySpecial {get; set; }
    public GenericSpecialClassAttribute(bool prop1, string prop2)
    {
       Prop1 = prop1;
       Prop2 = prop2;
    } 
}

どんな助けでも大歓迎です。これを他のインターフェイスにキャストして、魔法のようなことをすると思います。しかし、それを使って何かをするヘルパーを見つけることができず、実装/モデルの階層を完全に理解していません。

4

2 に答える 2

1

にキャストしてみてくださいMicrosoft.Cci::IMetadataConstant。からデータをダンプするサンプル コードを次に示しますMicrosoft.Cci::ICustomAttribute

public static void parseCustomAttribute(Cci::ICustomAttribute customAttribute)
{ 
    foreach (Cci::IMetadataNamedArgument namedArg in customAttribute.NamedArguments)
    { 
        parseNamedArgument(namedArg);
    }

    foreach (Cci::IMetadataExpression arg in customAttribute.Arguments)
    {
        parseFixedArgument(arg);
    }

    Console.WriteLine("Type Reference:\t\t"+ customAttribute.Type.ToString());

    var constructor = customAttribute.Constructor as Cci::IMethodDefinition;
    if (constructor != null)
    {
        //parseMethodDefinition(constructor);
    }
    else
    {
        //parseMethodReference(constructor);
    }
}

private static void parseFixedArgument(Cci::IMetadataExpression fixedArgument)
{
    Console.WriteLine("Type Reference:\t\t" + fixedArgument.Type.ToString());

    var constValue = fixedArgument as Cci::IMetadataConstant;

    if (constValue != null)
    {
        Console.WriteLine("Value :"  + constValue.Value);
    }
}

private static void parseNamedArgument(Cci::IMetadataNamedArgument namedArg)
{
    Console.WriteLine("Name:" + "\t\t" + namedArg.ArgumentName.Value);
    parseFixedArgument(namedArg.ArgumentValue);
}
  • IMetadataNamedArgumentValueメタデータのブロブ ストリーム内の名前と値のペアを参照します。これらは、フィールドとプロパティを指定するために使用されます。あなたのクラスのために、CCIIsReallySpecialIMetadataNamedArgument
  • IMetadataExpressionコンストラクタの引数値を参照します。そのため、引数prop1とはCCI オブジェクト モデルのようにprop2保持されます。MetadataExpression
于 2012-12-15T10:10:23.717 に答える
0

Jason Bock のInjectorsをご覧ください。彼は InjectorContext.Find() メソッドで探していることを実行し、次に NotNullInjector.OnInject() メソッドでさまざまなプロパティ/パラメーターを検索すると思います。

彼のコードを実行してみると、自分がやりたいことを行う方法をよりよく理解できるようになります。

于 2010-01-31T13:42:53.017 に答える