2016-12-27 1 views
1

인터페이스에서 선언 된 속성의 속성을 사용하려고했습니다. 내가 상속 된 속성을 반환해야 진정한 상속 =와, 해당 GetCustomAttribute() 읽은 것을에서,인터페이스에서 상속 된 속성의 속성 사용

[AttributeUsage(AttributeTargets.Property, Inherited=true)] 
class My1Attribute : Attribute 
{ 
    public int x { get; set; } 
} 

interface ITest 
{ 
    [My1] 
    int y { get; set; } 
} 

class Child : ITest 
{ 
    public Child() { } 

    public int y { get; set; } 
} 

자,하지만 그것은 작동하지 않습니다 같습니다

는 가정합니다.

Attribute my = typeof(Child).GetProperty("y").GetCustomAttribute(typeof(My1Attribute), true); // my == null 

왜 작동하지 않습니까? 속성을 얻으려면 어떻게해야합니까?

답변

1

ChildITest 그들을 가지고, 사용자 정의 속성이없는, 그래서 당신은 ITest의 구성원에 GetCustomAttributes를 호출해야합니다.

상속과 구현간에 차이가 있습니다. ChildMy1Attribute으로 장식 된 y 속성을 가진 기본 클래스에서 파생 된 경우 상속이 문제가되지 않습니다. 귀하의 경우에는

, Child ITest를 구현하고 ITest은 상속 계층 이외의 다른 유형입니다.

void Main() 
{ 
    var my1Attribute = typeof(ITest).GetProperty("y").GetCustomAttribute(typeof(My1Attribute)) as My1Attribute; 
    Console.WriteLine(my1Attribute.x); // Outputs: 0 
} 

[AttributeUsage(AttributeTargets.Property, Inherited = true)] 
class My1Attribute : Attribute 
{ 
    public int x { get; set; } 
} 

interface ITest 
{ 
    [My1] 
    int y { get; set; } 
} 

class Child : ITest 
{ 
    public Child() { } 

    public int y { get; set; } 
} 
0

이것은 단순한 스케치 일뿐 상세한 답변이 아닙니다. Child부터 시작하여 속성을 찾는 방법에 대한 아이디어를 제공해야합니다.

typeof(Child).GetInterfaces()을 사용하면 ChildITest 인 것을 볼 수있는 배열을 얻을 수 있습니다.

typeof(Child).GetInterfaceMap(t) 

는 ("지도") (.TargetMethods에서) Child에서 어떤 속성 게터 (get 접근) get_y 참조하는 당신에게 구조를 줄 것이다에 해당 t이 (가) typeof(ITest) 당신은 그 배열에서 받고 있습니다 가정 인터페이스 (.InterfaceMethods). 대답은 또 다른 get_y입니다. 그래서 당신은 ITesty 속성의 get 접근자인 MethodInfo을 가지고 있습니다. 부동산 자체를 찾으려면 다음 페이지를 참조하십시오. this answer to Finding the hosting PropertyInfo from the MethodInfo of getter/setter. 속성 정보를 얻은 후에는 사용자 지정 특성을 검사하여 My1Attribute 및 그 값인 x을 찾습니다.

관련 문제