2012-02-26 3 views
1

나는 Attributes and Reflection을 보았고 이제는 특성의 메타 데이터를 보는 데 리플렉션을 사용하는 방법을 알고 있지만 cs 파일을 분석하고 사용되는 특성을 추출 할 수있는 독립형 도구를 만들 수 있습니까?Reflection 또는 Regex on Custom 속성

무엇을하려고합니까?

기본적으로 입력으로 C# code 걸리는 도구를 작업 중입니다. 다음 단계는 해당 소스 코드에서 어떤 속성이 사용되는지 확인하는 것입니다. IntrinsicCustom Attributes을 추출하십시오.

Probem? 당신이 추출 정적 및 속성의 메타 데이터 위에 당신을 줄 수있는 별도의 도구를 작성하지만, 당신의 attributes가 정의 된 같은 프로젝트에 I do not know in what direction I should movereflection를 사용하는 경우

이 의미가 있습니다.

일부는 내가 다른 내가 사용됩니다 응용 프로그램을 가지고 또한 작업 위

내게됩니다 Irony - .NET Language Implementation Kit

를 사용할 필요가 말하는대로 파일의 속성을 추출 할 Regex를 사용해야한다고 attributes(annotation) based Design Pattern Recovery에서 Source Code. Regex이 구하러 왔는지 또는 Reflection과 같은 것이 필요한지 나는 덜 알게되었습니다. 리플렉션은 런타임과 관련이 있습니다. 나는 실행 시간을 다룰 필요가 없다. 그냥 정적 파일 분석

+2

내가 반사와 C# 프로젝트 파일이 두 문제에 연결하는 방법을 이해할 수없는 정말 강력하고 유용한 있어야한다고 생각합니다. 리플렉션을 사용하는 경우 - 이미 컴파일 된 실행 파일 또는 dll로 작업하므로 프로젝트 파일을 구문 분석 할 필요가 없습니다. 소스로 작업해야하는 경우 리플렉션을 사용할 수 없습니다. – Archeg

+0

@Archeg 파일은 소스 코드를 읽고 구현 된 내용을 보는 것입니다. 소스 코드로 작업해야한다면 무엇을 사용해야합니까? –

+0

정말로 소스 코드를 파싱해야한다면 Rosalyn을 살펴볼 것입니다. 그러나 나는 결코 그것을 사용하지 않았다, 그래서 당신에게 스위트 룸 것입니다. 소스 코드를 파싱해야합니까? 리플렉션을 사용하지 않는 이유는 무엇입니까? – Archeg

답변

2

문제를 올바르게 이해하면 코드를 구문 분석해야합니다. Regex는 클래스 구조를 구문 분석 할 속성을 파싱하는 것 외에는 도움이되지 않습니다. 반사가 트릭을 할 수도 있지만 결과를 사용자에게 보여줄 수는 없습니다. 그러므로 가장 좋은 아이디어는 파서를 사용하여 소스에서 표현식 트리를 가져 와서 조사하는 것입니다.

어떤 파서를 선택해야할지 모르시는 경우 - Rosalyn을 권장합니다. C# 코드를 파싱하기에 가장 쉽기 때문에 (특히이를 위해 설계되었습니다).현재 구문 분석에 대한 예를 찾을 수 있습니다 http://blog.filipekberg.se/2011/10/20/using-roslyn-to-parse-c-code-files/

나는 그것이 당신의 작업

2

분명히 나는 ​​의견을 말할만큼 충분한 평판이 없다. 그래서 나는 이것을 대답으로 말해야 할 것이다.

리플렉션은 런타임 유형 정보를 다룹니다. 프로그래머가 이미 알지 못하는 유형에 대한 정보를 찾는 메커니즘입니다 (아마도 다른 사람이 여러분에게 코드 라이브러리를 제공하고 문서화하는 것을 잊었을 것입니다). Reflection은 메소드, 속성, 필드, 속성 및 상속 된 인터페이스/클래스를 비롯하여 클래스의 공개 계약에 대해 필요한 모든 정보를 제공합니다.

무엇 하지만 파서가 필요합니다. 파서는 파일을 처리하고 특정 정보를 추출하는 표준 프로그래밍 개념입니다. 아직 런타임 유형이 아닌 코드 파일의 정보를 찾고 있습니다. 즉, 정보 파일에는 정보가 없지만 코드 파일이므로 눈을가집니다. 당신의 눈이 충분하지 않다면 (나는 당신이 질문을하지 않는다고 의심한다.) 파서를 작성해야한다. cs 파일에서 특정 정보를 추출하는 것은 매우 간단합니다. 그리고 속성의 정규 표현식은 다음과 같습니다. \[.+\]

+0

실제로 디자인 패턴 복구 작업을하고 있습니다. –

+0

당신이 필요로하는 것을 실제로 보여주지 못했다고 생각하기 시작했습니다. 당신이 말한 것에 단순히 소스 파일을 정규 표현식으로 일치 시키면 소스 파일에 선언 된 전체 속성 목록을 얻을 수 있습니다. – lassombra