거기에 반사 사례의 전체 풍부한 중 하나를 얻을 수 있습니다 :
1. 클래스의 모든 속성
2. 문자열 이름을 알고 있으면 단일 속성
리플렉션, TypeDescriptor 또는 기타 방법을 사용하여 런타임에 클래스에서 속성의 문자열 이름을 가져 오는 방법이 있습니까? 클래스 및 속성의 인스턴스 만 있으면됩니다.
편집하다리플렉션을 사용하여 클래스의 모든 속성을 쉽게 가져올 수 있고 각 속성의 이름을 얻을 수 있다는 것을 알고 있습니다. 내가 요구하는 것은 그것이 속성의 인스턴스를 전달하면, 속성의 이름을 알려주는 함수입니다. 다시 말해, PropertyInfo [] 배열에서 원하는 속성이 class.GetType () .GetProperty (myProperty)에서 반환되어 PropertyInfo.Name을 얻을 수있는 방법을 찾으려면 어떻게해야합니까?
이미PropertyInfo
그러면 @ dtb의 대답이 올바른 것입니다. 그러나 현재 속성의 코드를 찾으려면 현재 호출 스택을 탐색하여 현재 실행중인 메서드를 찾고 거기에서 속성 이름을 파생시켜야합니다.
var stackTrace = new StackTrace();
var frames = stackTrace.GetFrames();
var thisFrame = frames[0];
var method = thisFrame.GetMethod();
var methodName = method.Name; // Should be get_* or set_*
var propertyName = method.Name.Substring(4);
편집하다:
당신의 설명을 한 후에, 당신이하고 싶은 것이 속성에서 속성의 이름을 얻는 지 궁금합니다.표현. 그렇다면 다음과 같은 메소드를 작성하는 것이 좋습니다.
public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
{
return (propertyExpression.Body as MemberExpression).Member.Name;
}
이것을 사용하려면 다음과 같이 작성하십시오.
var propertyName = GetPropertyName(
() => myObject.AProperty); // returns "AProperty"
() => myObject.AProperty
AProperty가 유형 인 람다 식이었습니다.int
, 그 타입은 기본적으로 "파라미터가없는 메소드"()
돌아 오는=>
~int
(정적 유형 지정을 통해 내재적으로 결정됨).Func<int>
. 이후GetPropertyName
걸린다Expression
, 매개 변수의 유형이 다음으로 변환됩니다.Expression<Func<int>>
대신. - Jacob
C #6.0 (Visual Studio 2015)을 사용하면nameof
연산자, 이렇게 :
var obj = new MyObject();
string propertyName = nameof(obj.Property);
string methodName = nameof(obj.Method);
string directPropertyName = nameof(MyObject.Property);
string directMethodName = nameof(MyObject.Method);
누군가 그것을 필요로하는 경우 ... 여기에 답변의 VB .NET 버전입니다 :
Public Shared Function GetPropertyName(Of t)(ByVal PropertyExp As Expression(Of Func(Of t))) As String
Return TryCast(PropertyExp.Body, MemberExpression).Member.Name
End Function
용법:
Dim name As String = GetPropertyName(Function() (New myObject).AProperty)
acutully는 TKTS에 의해 작성된 정답이며, 여기서는 구문을 C #으로 변환하고 싶습니다.
public static string GetPropertyName<t>(Expression<Func<t>> PropertyExp)
{
return (PropertyExp.Body as MemberExpression).Member.Name;
}
이 코드의 사용법은 다음과 같습니다.
string name = GetPropertyName(() => (new Tasks()).Title);
또한 예외는 모든 속성에 null 값이있는 경우 예외가 발생할 수 있으므로 코드를 구현할 때 아무도 자신의 집중도에 따라야합니다
고마워요 TKTS ..
야곱이 제공 한 버전을 사용했지만 때로는 예외가 발생했습니다. 캐스트가 유효하지 않았기 때문입니다. 이 버전은이 문제를 해결했습니다.
public static string GetPropertyName<T>(this Expression<Func<T>> propertyExpression)
{
ConstantExpression cExpr = propertyExpression.Body as ConstantExpression;
MemberExpression mExpr = propertyExpression.Body as MemberExpression;
if (cExpr != null)
return cExpr.Value.ToString();
else if (mExpr != null)
return mExpr.Member.Name;
else return null;
}