19

"nameof"표현식이 Visual Studio 2015 및 C #6에 도입되었습니다.

nameof (C #및 Visual Basic 참조)

어떻게 그것을 사용할 수 있습니다 또는 NET 프레임 워크 4와 같은 이전 버전에서 비슷한 방법을 써주세요.


  • Expression을 사용하는 더러운 방법이 있습니다. - leppie
  • .NET Framework 버전은 관련이 없으며 C #6 기능입니다. VS 2015를 사용하는 경우이 버전을 사용하여 모든 버전의 프레임 워크를 타겟팅 할 수 있습니다. - Charles Mager
  • C #/ .NET 버전 불일치에 대해 혼란스러워하는 분은 다음을 참조하십시오.stackoverflow.com/questions/28921701/…- tl; dr Roslyn은 구문 설탕 인 C #6 언어 기능을 이전 .NET 버전과 호환되는 코드로 변환합니다 (예 :nameof(parameter)된다"parameter"). 그러나 현재 VS2015는 Roslyn을 지원하는 유일한 IDE이므로 VS2013 이전 버전에서는 작동하지 않습니다. - Ian Kemp
  • C #6 "nameof" 키워드가 임의의 유형에 대한 회원 이름을 반환 할 수없는 것 같습니다. 이를 위해, Expression < Func < TSource, TProperty > > 타입의 파라미터를 취하는 커스텀 NameOf 메소드는, 여전히 필요한 것 같습니다. - bugged87

4 답변


23

C #6 이전의 C #에 해당하는 기능을 말하면 속성에 대한 작업이 완료됩니다 (해킹 된 방식으로). 필드, 메서드 등을 포함하도록 확장 될 수 있습니다.

public static class TestExtension
{
    public static String nameof<T, TT>(this T obj, Expression<Func<T, TT>> propertyAccessor)
    {
        if (propertyAccessor.Body.NodeType == ExpressionType.MemberAccess)
        {
            var memberExpression = propertyAccessor.Body as MemberExpression;
            if (memberExpression == null)
                return null;
            return memberExpression.Member.Name;
        }
        return null;
    }
}

빨리 처리 했으므로 개선해야 할 것이 많지만 다음과 같이 사용합니다.

public class myClass
{
    public string myProp { get; set; }
}

var a = new myClass();
var result = a.nameof(b => b.myProp);

결과에 'myProp'이 포함되어 있습니다.

최신 정보:

더 포괄적 인 (그래도 그다지 예쁜 것은 아니지만)

public static class TestExtension
{
    public static String nameof<T, TT>(this Expression<Func<T, TT>> accessor)
    {
        return nameof(accessor.Body);
    }

    public static String nameof<T>(this Expression<Func<T>> accessor)
    {
        return nameof(accessor.Body);
    }

    public static String nameof<T, TT>(this T obj, Expression<Func<T, TT>> propertyAccessor)
    {
        return nameof(propertyAccessor.Body);
    }

    private static String nameof(Expression expression)
    {
        if (expression.NodeType == ExpressionType.MemberAccess)
        {
            var memberExpression = expression as MemberExpression;
            if (memberExpression == null)
                return null;
            return memberExpression.Member.Name;
        }
        return null;
    }
}

정적 속성 / 필드 액세스 :

TestExtension.nameof(() => myClass.MyOtherField)

함수 내의 매개 변수 액세스 :

void func (int a) {
    TestExtension.nameof(() => a);
}


  • dynamic? 무엇 때문에? - leppie
  • @leppie PropertyExpression은 내부 (private?) 클래스이므로 Member.Name을 검색하기 위해 캐스트 할 수 없습니다. 이제 막 작업을 떠나는 것에 대해 올바른 Expression 클래스가 무엇인지 올바르게 파악할 시간이 없었습니다. 그래도 그것을 고쳐 주시기 바랍니다 :) - Rob
  • 그러한 클래스는 없습니다 (최소한 .NET 3.5에는 없습니다).MemberExpression그것이 될 것입니다. - leppie
  • 가장 확실한 것은PropertyExpression수업. 줄에 달라 붙어 라.var type = propertyAccessor.Body.GetType();- 당신이 옳을지라도,MemberExpression이 예제를 위해 내가 던지려고했던 것입니다. 코드를 업데이트하겠습니다. - Rob
  • 내가 말했듯이 .NET 3.5에서는 그렇지 않습니다. 그리고 아마도 그것은 아주 좋은 이유입니다.internal이후 버전에서 :) - leppie

5

nameOf-에서 해결됩니다.Compiletime- 디 컴파일을하면 컴파일러가 클래스 네임 (네임 스페이스 (!)없이)을 상수 문자열로 변환했다는 것을 알 수 있습니다. 그러니주의하십시오!

당신이 classe의 이름을 사용하고 싶다면typeof()또는GetType()특정 유형 (파생되었을 수 있음)을Runtime의 가치를 읽고

그만큼.Name.net의 등록 정보 < C #6.

자세히보기MSDN


  • typeof(T).Name변수의 이름이 아닌 유형의 이름을 반환합니다. - Charles W
  • @CharlesW 맞아, 다른 어떤 것도 요구하지 않았다 ...? - Cadburry
  • 나는 이것이 오래된 것을 알고 있지만,nameof형식 이름이 아닌 필드 또는 속성 이름을 가져 오는 것입니다. 원래 이름이 묻는 질문이었습니다. - James M

2

내 지식에는 마법의 문자열을 사용할 필요가없는 세 가지 옵션이 있습니다.

  1. 의 이름Visual Studio 2015가 필요합니다 (그러나 .net 프레임 워크의 다른 버전으로 컴파일 될 수 있음)

    nameof(this.Property)
    
  2. 표현식을 취하고이 게시물에있는 속성 이름을 반환하는 메소드를 사용하십시오. "리플렉션을 사용하여 속성의 문자열 이름 가져 오기"

    var propertyName = GetPropertyName(  
        () => myObject.AProperty); // returns "AProperty"
    
  3. CallerMemberNameAttribute - (원래 프레임이 4.5를 포함하는 .net 프레임 워크 4.0과 같은 이전 버전을 말하기 때문에 .net 프레임 워크 4.5에서만 사용할 수 있습니다.)이 메서드의 무승부는 현재 메서드의 문자열 표현이 필요할 때만 유용합니다 당신은 안으로 작동하고 있습니다.

    public string IsChecked  {
       set{
           Console.WriteLine(GetCurrentMemberName()); // prints "IsChecked"
       }
    }
    
    string GetCurrentMemberName([CallerMemberName] string memberName = "")
    {
         return memberName;
    }
    


1

nameof 연산자는 전달한 변수의 문자열 표현을 반환하므로 nameof (var1)은 "var1"을 반환하므로 변수 예외를 인수 예외와 같은 문자열로 사용해야하는 코드를 피하는 데 유용합니다.

이전 버전에서는 리플렉션 또는 표현식 트리를 사용하여 비슷한 효과를 얻을 수있었습니다.

연결된 질문


관련된 질문

최근 질문