2014-01-29 4 views
0

일반적으로, Atr에 대한 함수 Atr 속성이 있습니다. 다른 클래스 B를 원합니다. Atr에 등록 된 클래스를 가져옵니다. 내 경우에는 Type = typeof (A) 인 경우에만 대답해야합니다. 아이디어를 얻길 바랍니다. 답변 주셔서 감사합니다.속성을 통해 유형을 정의하는 방법은 무엇입니까?

다음은 샘플 코드입니다.

public class Atr: Attribute 
{ 
    public Atr() 
    { 
     DefaultDescription = "hello"; 
     Console.WriteLine("I am here. I'm the attribute constructor!"); 
    } 

    public String CustomDescription { get; set; } 
    public String DefaultDescription { get; set; } 

    public override String ToString() 
    { 
     return String.Format("Custom: {0}; Default: {1}", CustomDescription, DefaultDescription); 
    } 
} 

class B 
{ 
    public void Laun() 
    { 
     Type myType = typeof(A); // хочу получить тоже самое только через Atr 
    } 
} 

class A 
{ 
    [Atr] 
    public static void func(int a, int b) 
    { 
     Console.WriteLine("a={0} b={1}",a,b); 
    } 
} 
+0

당신이 묻는 것을 완전히 모르는 경우,'func' 메쏘드에'Atr' 속성이 있는지 확인하고 싶습니까? –

+0

속성이있는 클래스의 유형을 결정하고 싶습니다. 예를 들어 속성이있는 모든 클래스에서 메서드를 호출하면 Atr이 Type을 확인합니다. – askeet

답변

0

당신은 지정된 속성으로 장식되어 그들의 방법을 가지고있는 모든 클래스를 찾기 위해 총회에 반사를 사용할 수 있습니다

열거의 Assembly.GetTypes 방법 ( http://msdn.microsoft.com/en-us/library/system.reflection.assembly.gettypes%28v=vs.110%29.aspx)에서

봐 주어진 어셈블리의 모든 유형.

Type.GetMethods를보고 주어진 유형 (http://msdn.microsoft.com/en-us/library/424c79hc%28v=vs.110%29.aspx)의 모든 public 메소드를 열거하십시오.

마지막으로 MemberInfo.CustomAttributes (http://msdn.microsoft.com/en-us/library/system.reflection.memberinfo.customattributes%28v=vs.110%29.aspx)를보고 주어진 메서드의 모든 사용자 지정 특성을 나열하십시오. CustomAttributes는 비교할 수있는 AttributeType 속성을 가진 CustomAttributeData 유형입니다.

루프 수 (3 개의 중첩 된 루프)로 추측 할 수 있듯이 SLOW는 물론 쉽지도 않고 복잡하지도 않으므로 클래스의 다른 측면을 꾸밀 수 있습니다 , 가능하다면 접근 방식을 전적으로 바꾸십시오. 예를 들어, 클래스 자체를 꾸미면 조금 쉬울 것입니다 : Find all classes with an attribute containing a specific property value.

Type aType = null; 
foreach (Type t in Assembly.GetExecutingAssembly().GetTypes()) { 
    foreach (MethodInfo mi in t.GetMethods()) { 
    foreach (CustomAttributeData cad in mi.CustomAttributes) { 
     if (cad.AttributeType == typeof(Atr)) { 
     aType = t; 
     break; 
     } 
    } 
    } 
} 

if (aType == null) { 
    // not found 
} else { 
    // found and aType = typeof(A) in your exmaple 
} 

참고 :

클래스 유형을 찾을 수있는 코드는 다음과 같이 (완전히 테스트되지 않은)을보고 끝나는 당신이 (Type 클래스에 IsClass 속성을 참조하십시오) 권리 유형을 통해 열거 확인해야 ,하지만 나는 그것을 명확하게하기 위해 버렸다.

희망이 도움이됩니다.

+0

Thansk for idea. 어쩌면 프로젝트 네임 스페이스를 얻을 수 있을까요? 클래스와 관련된 속성을 가진 메소드를 검색합니까? – askeet

관련 문제