사용자 지정 Attribute 작성 (AttributeUsageAttribute)

in kr •  6 years ago  (edited)

Switch...Case 문을 사용하다 보면 Enum값이 많아 질수록 코드가 복잡해지는 경향이 있어
다른 방법이 없나 찾아보다가 발견한 방법입니다.

public enum EState
{
    State1,
    State2,
    State3,
    State4,
    State5,
}

private void SwitchCase(EState eState)
{
       switch (eState)
        {
            case EState.State1:
                {
                    // ...
                }
                break;
            case EState.State2:
                {
                    // ...
                }
                break;
            case EState.State3:
                {
                    // ...
                }
                break;
            case EState.State4:
                {
                    // ...
                }
                break;
            case EState.State5:
                {
                    // ...
                }
                break;
        }
 }

위 소스에서 중괄호 안에 코드가 복잡해지면 결국 함수로 빼는 작업을 하게 됩니다.

그래서 아래 코드처럼 아예 시작부터 함수로 만드는 작업을 찾아하게 됐습니다.
단점은 코딩량이 많아지는 문제가 있지만 함수 선언 양이 많을 수록 효과는 좋습니다.

using System.Reflection;

protected Dictionary<int, Action> m_dictMethods = new Dictionary<int, Action>();
private void InitMethod()
{
       m_dictMethods.Clear();

        foreach (MethodInfo mInfo in GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance))
        {
            object[] attributes = mInfo.GetCustomAttributes(true);
​
            foreach (object attribute in attributes)
            {
                var methodAttr = attribute as MethodAttribute;
​
                if (methodAttr != null)
                {
                    EState eState = methodAttr.State;
                    var methodToMap = (Action)Delegate.CreateDelegate(typeof(Action), this, mInfo);
                    m_dictMethods.Add((int)eState, methodToMap);
                }
            }
        }
}
[AttributeUsage(AttributeTargets.Method)]
public class MethodAttribute : Attribute
{
    public EState State { get; set; }
    public MethodAttribute(EState state)
    {
        State = state;
    }
}
private void OnStateMethod(EState eState)
{
        if (m_dictMethods.ContainsKey((int)eState))
        {
            m_dictMethods[(int)eState]();
        }
}

여기까지가 준비 단계입니다.
OnStateMethod(EState)를 어디선가 호출해주면 됩니다.

[MethodAttribute(EState.State1)]
void Method1()
{
        // ...
}
​
[MethodAttribute(EState.State2)]
void Method2()
{
        // ...
}

그리고 이렇게 사용해주면 됩니다.

​한 두개의 상태처리를 위해 이런 작업을 한다면 굉장히 비효율적이지만
많은 양의 상태를 처리할 때는 코드가 분리되어 보기 쉽고
추가도 간단하게 할 수 있습니다.

nimiq.png

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

✅ Enjoy the vote! For more amazing content, please follow @themadcurator for a chance to receive more free votes!