C# Attribute 상속 후 override 할 경우 부모 값도 잘 가져오는지 확인


C# Attribute class 생성 및 사용, 상속시에 동작 등에 대해서 확인 가능한 예제코드 입니다.

코드 다운로드 : https://github.com/DevStarSJ/Study/tree/master/Blog/CSharp/AttributeInheritTest

Step 1. Attribute 존재여부 검사

AttributeInheritTest.01.cs

using System;

public class Test1Attribute : Attribute
{
    public int t1 { get; set; }
    public Test1Attribute(int t)
    {
        t1 = t;
    }
}

public class Test2Attribute : Attribute
{
    public int t2 { get; set; }
    public Test2Attribute(int t)
    {
        t2 = t;
    }
}

public class Parent
{
    [Test1(1)]
    [Test2(2)]
    public int id { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var propertyInfo = typeof(Parent).GetProperty(nameof(Parent.id));

        var attributes = Attribute.GetCustomAttributes(propertyInfo, true);
        foreach (var a in attributes)
        {
            Console.WriteLine(a.GetType().ToString());
        }
    }
}
Test2Attribute
Test1Attribute

Step 2. Attribute 내부 값 사용하기

foreach 내부만 수정

AttributeInheritTest.02.cs

foreach (var a in attributes)
{
    Console.WriteLine(a.GetType().ToString());

    if (a.GetType() == typeof(Test1Attribute))
    {
        Console.WriteLine((a as Test1Attribute).t1);
    }
    else if (a.GetType() == typeof(Test2Attribute))
    {
        Console.WriteLine((a as Test2Attribute).t2);
    }
}
Test2Attribute
2
Test1Attribute
1

Step 3. 상속받은 후 Attribute 존재여부 검사 및 값 사용하기

Child 정의 및 propertyInfo 생성 부분만 수정

AttributeInheritTest.03.cs

public class Child : Parent
{
}

var propertyInfo = typeof(Child).GetProperty(nameof(Child.id));
Test2Attribute
2
Test1Attribute
1

Step 4. 상속받은 후 property를 override한 후 Attribute 재정의

재정의한 Attribute만 바뀌었고, 나머지는 부모의 것을 가져오는 것을 확인 할 수 있습니다.

Parentidvirtual처리 하였고, Childidoverride한 후 Test2Attribute만 재정의 하였습니다.

AttributeInheritTest.04.cs

public class Parent
{
    [Test1(1)]
    [Test2(2)]
    public virtual int id { get; set; }
}

public class Child : Parent
{
    [Test2(3)]
    public override int id { get; set; }
}
Test2Attribute
3
Test1Attribute
1

이 글이 도움이 되셨다면 공감 및 광고 클릭을 부탁드립니다 :)