2010-01-05 5 views
1

코드 생성기를 만드는 데 CCI-Metadata를 사용하고 어셈블리 집합을 반복 실행하여 형식과 해당 메타 데이터를 검색 한 다음 코드를 생성합니다. 원래 유형의 메타 데이터에 사용자 지정 특성을 첨부하여 코드 생성을 제어 할 수 있기를 원합니다. 같은Common Compiler Infrastructure : ICustomAttribute를 사용하는 방법

뭔가 :

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

도움이 필요하면 도움을 주시면 감사하겠습니다. 나는 이것을 다른 인터페이스로 던져서 마법 같은 것을 해보 았다고 가정합니다. 그러나 그것으로 무엇이든 도우미를 찾지 못했고 구현/모델 계층을 완전히 이해하지 못했습니다.

답변

0

Jason Bock의 Injectors을 확인하십시오. 나는 그가 InjectorContext.Find() 메소드에서 찾고있는 것을 수행 한 다음 NotNullInjector.OnInject() 메소드에서 다른 속성/매개 변수를 조회한다고 생각한다.

코드를 작성하고 실행하면 원하는 작업을 수행하는 방법을 더 잘 이해할 수 있습니다.

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

    메타 데이터의 Value 블롭 스트림 이름/값 쌍을 지칭한다. 필드와 속성을 지정하는 데 사용됩니다. 클래스의 경우 CCI는 을 IMetadataNamedArgument
  • IMetadataExpression으로 사용할 수 있습니다. 생성자의 인수 값을 참조하십시오. 따라서 prop1prop2은 CCI 객체 모델에 MetadataExpression으로 유지됩니다.