Home Full Site
C# : nameof() 사용

C#에서 nameof()는 클래스명, 메서드명, 파라미터명 등을 코드 상에 문자열로 가져오기 위해 사용된다. 예들 들어, 아래 예제처럼 Order 클래스명을 사용하기 위해 nameof(Order)를 사용하면 'Order'라는 문자열을 리턴하게 된다.

그러나, C# 11 이전에는 nameof(파라미터) 표현을 메서드 앞의 Attribute에서는 사용할 수 없었는데, 만약 C# 11 이전 버전에서 아래 Attribute를 [Custom(nameof(orderId))] 와 같이 사용하면, CS0103: The name 'orderId' does not exist in the current context 라는 컴파일 에러를 발생시킨다.


예제

// C# 9

public class Order
{    
    // [Custom(nameof(orderId))]  -- 이렇게 하면 CS0103 에러 발생
    [Custom("orderId")]
    public void Process(int orderId, bool flag)
    {
        string clsName = nameof(Order);  // "Order"
        string method = nameof(Process); // "Process"
        string param1 = nameof(orderId); // "orderId"
        string param2 = nameof(flag);    // "flag"

        Debug.WriteLine($"Call {clsName}.{method}({param1}: {orderId}, {param2}: {flag})"); ;
        // 출력: Call Order.Process(orderId: 101, flag: True)
    }
}

public class CustomAttribute : Attribute {
    public CustomAttribute(string paramName) { /* ... */ }
}

class Program
{
    static void Main(string[] args)
    {
        new Order().Process(101, true);
    }
}



C# 11 : 확장된 nameof 사용 범위

C# 11 부터 메서드 앞의 Attribute에서 파라미터명에 대해 nameof() 를 사용할 수 있게 하였다. 위의 예제에서 Attribute를 [Custom(nameof(orderId))]으로 바꾸어도 더이상 컴파일 에러를 발생시키지 않는다. 또한, 제네릭 파라미터도 Attribute에서 nameof(제네릭타입명) 방식으로 사용할 수 있으며, 람다식에서도 동일한 방식으로 nameof를 사용할 수 있다.

예제

// C# 11 : Extended nameof scope

public class Order
{
    // 파라미터명에 nameof 사용
    [Custom(nameof(orderId))]  
    public void Process(int orderId, bool flag)
    {
        string className = nameof(Order);
        string methodName = nameof(Process);
        string p1 = nameof(orderId);
        string p2 = nameof(flag);
    }

    // 제네릭 타입명에 nameof 사용
    [Custom(nameof(TName))]  
    public void Cancel<TName>() { }
}

public class CustomAttribute : Attribute
{
    public CustomAttribute(string paramName) { /* ... */ }
}



© csharpstudy.com