"nameof"표현식이 Visual Studio 2015 및 C #6에 도입되었습니다.
어떻게 그것을 사용할 수 있습니다 또는 NET 프레임 워크 4와 같은 이전 버전에서 비슷한 방법을 써주세요.
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
? 무엇 때문에? - leppieMemberExpression
그것이 될 것입니다. - leppiePropertyExpression
수업. 줄에 달라 붙어 라.var type = propertyAccessor.Body.GetType();
- 당신이 옳을지라도,MemberExpression
이 예제를 위해 내가 던지려고했던 것입니다. 코드를 업데이트하겠습니다. - Rob♦internal
이후 버전에서 :) - leppie
nameOf
-에서 해결됩니다.Compiletime
- 디 컴파일을하면 컴파일러가 클래스 네임 (네임 스페이스 (!)없이)을 상수 문자열로 변환했다는 것을 알 수 있습니다.
그러니주의하십시오!
당신이 classe의 이름을 사용하고 싶다면typeof()
또는GetType()
특정 유형 (파생되었을 수 있음)을Runtime
의 가치를 읽고
그만큼.Name
.net의 등록 정보 < C #6.
자세히보기MSDN
내 지식에는 마법의 문자열을 사용할 필요가없는 세 가지 옵션이 있습니다.
의 이름Visual Studio 2015가 필요합니다 (그러나 .net 프레임 워크의 다른 버전으로 컴파일 될 수 있음)
nameof(this.Property)
표현식을 취하고이 게시물에있는 속성 이름을 반환하는 메소드를 사용하십시오. "리플렉션을 사용하여 속성의 문자열 이름 가져 오기"
var propertyName = GetPropertyName(
() => myObject.AProperty); // returns "AProperty"
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;
}
nameof 연산자는 전달한 변수의 문자열 표현을 반환하므로 nameof (var1)은 "var1"을 반환하므로 변수 예외를 인수 예외와 같은 문자열로 사용해야하는 코드를 피하는 데 유용합니다.
이전 버전에서는 리플렉션 또는 표현식 트리를 사용하여 비슷한 효과를 얻을 수있었습니다.
nameof(parameter)
된다"parameter"
). 그러나 현재 VS2015는 Roslyn을 지원하는 유일한 IDE이므로 VS2013 이전 버전에서는 작동하지 않습니다. - Ian Kemp