특정 속성에 대한 PropertyInfo를 얻고 싶습니다. 다음을 사용할 수 있습니다.
foreach(PropertyInfo p in typeof(MyObject).GetProperties())
{
if ( p.Name == "MyProperty") { return p }
}
하지만 다음과 비슷한 방법이 있어야합니다.
typeof(MyProperty) as PropertyInfo
거기 있어요? 아니면 유형이 안전하지 않은 문자열 비교를 계속하고 있습니까?
건배.
답변
nameof()
C # 6의 일부이며 Visual Studio 2015에서 사용할 수 있는 new 연산자를 사용할 수 있습니다 . 자세한 내용은 여기 .
예를 들어 다음을 사용합니다.
PropertyInfo result = typeof(MyObject).GetProperty(nameof(MyObject.MyProperty));
컴파일러는 nameof(MyObject.MyProperty)
“MyProperty”문자열 로 변환 되지만 Visual Studio, ReSharper 등은 nameof()
값 을 리팩터링하는 방법을 알고 있기 때문에 문자열을 변경하지 않고도 속성 이름을 리팩터링 할 수 있다는 이점을 얻을 수 있습니다.
답변
Expression
문자열을 사용하지 않는 lambdas /와 함께 .NET 3.5 방법이 있습니다.
using System;
using System.Linq.Expressions;
using System.Reflection;
class Foo
{
public string Bar { get; set; }
}
static class Program
{
static void Main()
{
PropertyInfo prop = PropertyHelper<Foo>.GetProperty(x => x.Bar);
}
}
public static class PropertyHelper<T>
{
public static PropertyInfo GetProperty<TValue>(
Expression<Func<T, TValue>> selector)
{
Expression body = selector;
if (body is LambdaExpression)
{
body = ((LambdaExpression)body).Body;
}
switch (body.NodeType)
{
case ExpressionType.MemberAccess:
return (PropertyInfo)((MemberExpression)body).Member;
default:
throw new InvalidOperationException();
}
}
}
답변
다음과 같이 할 수 있습니다.
typeof(MyObject).GetProperty("MyProperty")
그러나 C #에는 “기호”유형이 없기 때문에 문자열 사용을 피하는 데 도움이되는 것은 없습니다. 그런데 왜 이것을 안전하지 않다고 부르나요?
답변
리플렉션은 런타임 유형 평가에 사용됩니다. 따라서 컴파일 타임에 문자열 상수를 확인할 수 없습니다.