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# 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);
}
}
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) { /* ... */ }
}
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) { /* ... */ }
}