2010-02-07 2 views
1

다음과 같은 클래스 집합이 있다고 가정 해 봅시다. DerivedClass의 특성을 병합 할 수 있습니까? 현재 GetType(). GetCustomAttributes() 메서드를 상속에 대해 true로 전달하면 상속 구조에서 가장 높은 특성을 사용합니다.C#에서 클래스의 병합 된 속성을 가져올 수 있습니까?

즉 [다른 ("밥")] 및 속성을 병합하는 [내 (16)]

이 가능한가? 그래서 나는 [My (16, "Male")]과 [Another ("Bob")]의 두 속성으로 끝날 것입니다.

나는 [My , "Male")] 오히려 나는 Age of 16과 Male of Gender라는 속성을 반환 할 것입니다.

public class MyAttribute : Attribute 
{ 

    public MyAttribute(int age) 
    { 
     Age = age; 
    } 

    public MyAttribute(int age, string gender) 
    { 
     Age = age; 
     Gender = gender; 
    } 

    public int Age { get; set; } 

    public string Gender { get; set; } 

} 

public class AnotherAttribute : Attribute 
{ 

    public AnotherAttribute(string name) 
    { 
     Name = name; 
    } 

    public string Name { get; set; } 

} 

[My(12, "Male")] 
[Another("Bob")] 
public class BaseClass 
{ 
} 

[My(16)] 
public class DerivedClass : BaseClass 
{ 
} 
+0

이것을 달성하기 위해 속성을 "여러 번 허용"으로 표시하지 않아도됩니까? – bzlm

+0

@Craig : 내 대답이 업데이트되어 더 많은 정보를 제공 할 수 있습니다. – IAbstract

답변

2

당신 (이 당신의 속성에 적용되는 AttributeUsageAttribute의 옵션이다) 엔티티에 동일한 속성의 여러 인스턴스를 가질 수 있습니다. 유형에 대한 속성을 얻으면 상속 체인에 적용된 모든 속성을 가져올 수 있습니다.

그러나 표준 도구에는 두 개의 속성 인스턴스를 사용하여 하나만 만들 수있는 것이 없습니다.

난 당신이 있어야 AttributeUsage 속성에 따라 달라 대해 문의하고있는 행동의 믿을 수 없어,

+0

리차드에게 감사 드려요. 나는 모든 속성을 얻을 수 있기를 기대하고 있었고, 그 다음에 그것들을 합쳐야 만했다. 그러나 나는 단지 2 개의 속성 만 가지고있을 때 혼란스러워서 나 자신을 병합 할 수 없었다. –

0

먼저 (이론적으로 포스트 프로세서 MSIL이 작업을 수행 할 수 있습니다. 다시는 썼다) 귀하의 속성 클래스를 장식 (그것은 내가 틀릴 수있는 것처럼 보입니다). 또한 어떤 속성이 병합되는지를 알지 못합니다. 각 속성은 클래스 자체를 표현한 것입니다. 각 속성 클래스는 자신의 데이터를 반환해야합니다. 난 DerivedClass.GetCustomAttributes() 각 속성에 대한 3 개의 별도의 참조를 반환 - 기본 클래스에서 2, 그리고 자체에 대한 1을 기대합니다.

'MyAttribute'에서 AttributeUsage를 설정하여 여러 항목을 허용 해보십시오. 병합하지 않고 속성의 '최신'버전을 사용합니다.

나는 신비한 사라지는 행위를 일으킬 수있는 다른 것을 생각했습니다. 원래 속성을 가져 오려면 base 클래스를 따라 가야 할 수도 있습니다. 당신은 그것을 시도 할 수 :

base.GetType().GetCustomAttributes(); 

내가 뒷조사를했고, 여기에 AttibuteUsage 할 것입니다 그리고 당신 만 MyAttribute 클래스 중 하나를 참조하는 원인이 될 수 무엇을 : 나는 가까운했다

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] 

을 내 이전에 진술을 사용하는 경우 AttributeUsage; 그러나 기본 클래스 'MyAttribute 장식에 대한 가시성을 제한하는 것은 Inherited 명명 된 매개 변수입니다. Inherited = true을 지정하고 사용법을 확인하십시오.

+0

GetCustomAttributes는 두 가지 특성 만 반환합니다. BaseClass의 AnotherAttribute와 DerivedClass의 MyAttribute입니다. 나는 나 자신이 속성들을 합치는 것을 허용했을 3 개의 클래스를 기대하고 있었다. –

관련 문제