즉, 컴파일되지 않은 어셈블리를 만들 수 있습니다 (검사 코드가 제거되지 않은 것으로 가정). 클래스에는 사용자 지정 특성 (예 : 작성자 및 버전)이 없습니다 ("있어야 함")?컴파일 타임 (실행 시간 아님) 동안 C#에서 사용자 지정 특성을 쿼리 할 수 있습니까
using System;
using System.Reflection;
using System.Collections.Generic;
namespace ForceMetaAttributes
{
[System.AttributeUsage (System.AttributeTargets.Method, AllowMultiple = true)]
class TodoAttribute : System.Attribute
{
public TodoAttribute (string message)
{
Message = message;
}
public readonly string Message;
}
[System.AttributeUsage (System.AttributeTargets.Class |
System.AttributeTargets.Struct, AllowMultiple = true)]
public class AttributeClass : System.Attribute
{
public string Description { get; set; }
public string MusHaveVersion { get; set; }
public AttributeClass (string description, string mustHaveVersion)
{
Description = description;
MusHaveVersion = mustHaveVersion ;
}
} //eof class
[AttributeClass("AuthorName" , "1.0.0")]
class ClassToDescribe
{
[Todo (" A todo message ")]
static void Method()
{ }
} //eof class
//how to get this one to fail on compile
class AnotherClassToDescribe
{
} //eof class
class QueryApp
{
public static void Main()
{
Type type = typeof(ClassToDescribe);
AttributeClass objAttributeClass;
//Querying Class Attributes
foreach (Attribute attr in type.GetCustomAttributes(true))
{
objAttributeClass = attr as AttributeClass;
if (null != objAttributeClass)
{
Console.WriteLine("Description of AnyClass:\n{0}",
objAttributeClass.Description);
}
}
//Querying Class-Method Attributes
foreach(MethodInfo method in type.GetMethods())
{
foreach (Attribute attr in method.GetCustomAttributes(true))
{
objAttributeClass = attr as AttributeClass;
if (null != objAttributeClass)
{
Console.WriteLine("Description of {0}:\n{1}",
method.Name,
objAttributeClass.Description);
}
}
}
//Querying Class-Field (only public) Attributes
foreach(FieldInfo field in type.GetFields())
{
foreach (Attribute attr in field.GetCustomAttributes(true))
{
objAttributeClass= attr as AttributeClass;
if (null != objAttributeClass)
{
Console.WriteLine("Description of {0}:\n{1}",
field.Name,objAttributeClass.Description);
}
}
}
Console.WriteLine ("hit Enter to exit ");
Console.ReadLine();
} //eof Main
} //eof class
} //eof namespace
//uncomment to check whether it works with external namespace
//namespace TestNamespace {
// class Class1 { }
// class Class2 { }
//}
편집 : 여기
내가 실행 시간 동안 질의에 사용한 코드입니다 그냥 답변에 대한 내 선택을 정당화합니다. 나는 casperOne이 질문의 정답을 제공했다고 생각합니다.그러나 질문하는 이유는 weak 인 것 같습니다. 아마 내가 같은 일부 외부 도구를 사용하기 시작해야합니다
편집 ... PEX, NUnit과 또는 다른 단위 테스트 프레임 워크를 사용하여, FinalBuilder 또는이 "요구 사항"검사 단위 테스트를 만들 나는 작은 추가 code snippet 콘솔 프로그램의 체크를 수행하는 답변의 끝에 ... 논평, 비판 또는 개선 제안
다시 한번이 "요구 사항"이 단위 테스트의 일환으로 구현되어야한다는 것을 깨달았습니다. "체크인"
Thaks! "당신이하려고하는 것은 적절한 런타임 검사 대신 좋은 대안이 아닙니다."라는 말은 무엇을 의미합니까? –
@YordanGeorgiev : 속성이 적용되었는지 확인하는 빌드 프로세스가 있더라도 런타임 코드를 계속 확인하여 속성이 적용되었는지 확인해야합니다. 컴파일 시간에 잡은 것 같아서 거기서 체크하는 것을 멈출 수 없습니다. – casperOne
따라서 최소한 4 개의 "필수 항목"속성을 가져야하는 요구 사항은 반사 때문에 성능에 영향을 미칩니다 ... 유닛 테스트에서 점검을 수행하는 것이 더 좋은 아이디어 일 것 같네요! –