41

거기에 반사 사례의 전체 풍부한 중 하나를 얻을 수 있습니다 :

    1. 클래스의 모든 속성

    2. 문자열 이름을 알고 있으면 단일 속성

리플렉션, TypeDescriptor 또는 기타 방법을 사용하여 런타임에 클래스에서 속성의 문자열 이름을 가져 오는 방법이 있습니까? 클래스 및 속성의 인스턴스 만 있으면됩니다.

편집하다리플렉션을 사용하여 클래스의 모든 속성을 쉽게 가져올 수 있고 각 속성의 이름을 얻을 수 있다는 것을 알고 있습니다. 내가 요구하는 것은 그것이 속성의 인스턴스를 전달하면, 속성의 이름을 알려주는 함수입니다. 다시 말해, PropertyInfo [] 배열에서 원하는 속성이 class.GetType () .GetProperty (myProperty)에서 반환되어 PropertyInfo.Name을 얻을 수있는 방법을 찾으려면 어떻게해야합니까?


  • 속성의 getter / setter 내에서 속성의 이름을 가져 오는 것을 의미합니까? 당신이 "가지고있다"는 것은 무엇을 의미합니까? 재산? - Jacob
  • @Jacob - 선명도를 추가하려면 (getter / setter가 아닌) 문자열 이름을 가져 오려고하는 속성 (다른 속성과 함께)이있는 클래스의 인스턴스가 있습니다. 리플렉션을 사용하여 해당 속성에 대한 작업을 수행해야하지만 속성 이름을 리팩토링하는 경우 하드 코드 된 문자열 이름을 사용하여 코드를 유지 관리 할 필요가 없습니다. 따라서 프로퍼티의 이름을 프로그램 적으로 얻고 싶습니다. - Joel B
  • 이름이 아닌 다른 방법으로 원하는 부동산을 어떻게 확인할 수 있습니까? - jnylen
  • 속성에서 속성 이름을 가져 오는 방법은 내 업데이트를 참조하십시오.표현. - Jacob
  • 가능한 중복람다 식을 사용하여 속성 이름 및 유형 가져 오기 - nawfal

7 답변


83

이미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"


  • 표현의 사용에 +1; 이런 식으로 질문을 이해하지 못했습니다. - Ondrej Tucny
  • 표현식 +1. 나는 그걸로 미쳐 죽겠다! 많은 분들께 감사드립니다. (BTW, C #구문을 조금 설명해 주시면이게 꽤 발전된 것 같아요. 그렇지만 실제로 모든 것을 얻지는 못했지만 인정합니다. 매력) - Mehdi LAMRANI
  • 구문은 조금 이상합니다. 식의 구문은 람다 식의 구문과 같습니다. 그것의 여부는 호출되는 메소드의 매개 변수 유형에 따라 다릅니다. 만약() => myObject.APropertyAProperty가 유형 인 람다 식이었습니다.int, 그 타입은 기본적으로 "파라미터가없는 메소드"()돌아 오는=>~int(정적 유형 지정을 통해 내재적으로 결정됨).Func<int>. 이후GetPropertyName걸린다Expression, 매개 변수의 유형이 다음으로 변환됩니다.Expression<Func<int>>대신. - Jacob
  • 좋은 해결책을 가져 주셔서 감사합니다. 내 질문은 : 내가 구현할 수 있습니다 : 확장 메서드 myObject.AProperty.GetPropertyName ()? - masoud ramezani

44

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);


  • 이것은 정말 좋은 방법입니다. - Gandalf458
  • OP, 아직 밖에 나가면 대답을 다시 선택 하시겠습니까? - William T. Mallard

5

누군가 그것을 필요로하는 경우 ... 여기에 답변의 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)


  • 감사합니다. TKTS, 답은 훌륭합니다.이 구문의 C #코드입니다. public static string GetPropertyName < t > (Expression < Func < t > PropertyExp) {return (MemberExpression.Member.Name; } 문자열 이름 = GetPropertyName (() = > (새 작업 ()). 제목); - Ahmad Hindash

3

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 ..


0

myClassInstance.GetType().GetProperties()너를 준다.PropertyInfo모든 공공 자산에 대한 인스턴스myClassInstance타입. (만나다MSDN문서 및 기타 과부하의 경우). 'PropertyInfo.Name'은 속성의 실제 이름입니다. 당신이 이미 재산의 이름을 알고 있다면GetProperty(name)그것의 검색PropertyInfo개체MSDN다시).


0

야곱이 제공 한 버전을 사용했지만 때로는 예외가 발생했습니다. 캐스트가 유효하지 않았기 때문입니다. 이 버전은이 문제를 해결했습니다.

    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;
    }

연결된 질문


관련된 질문

최근 질문