확장 메서드를 사용하여 클래스 멤버 (필드 전용)의 사용자 지정 특성을 확인하려고합니다.확장 메서드를 사용하여 필드의 특성에 액세스
public class DatabaseIdAttribute : Attribute
{
public int ID { get; set; }
public DatabaseIdAttribute(int id)
{
this.ID = id;
}
}
public class MyClass
{
[DatabaseId(1)]
double Height {get;set;}
[DatabaseId(2)]
double Width {get;set;}
double Area { get { return this.Height * this.Width; }
}
마법 필드를 전달하는 대신 클래스 필드에 액세스하려면 확장 메서드에서 LINQ 식을 사용하고 싶습니다.
var myClass = new MyClass();
var attribute = myClass.GetAttribute<DatabaseIdAttribute>(c => c.Height);
달성 할 수 있습니까? 시간에 대한
[편집]
, 나는 @leppie 다음과 같은 방법으로var c = new MyClass();
var attribute = c.GetMember(m => m.Height).GetAttribute<DatabaseIdAttribute>();
의 속성을 얻을 수 있습니다
public static MemberInfo GetMember<T, R>(this T instance, Expression<Func<T, R>> selector)
{
var member = selector.Body as MemberExpression;
if (member != null)
{
return member.Member;
}
return null;
}
public static T GetAttribute<T>(this MemberInfo member) where T : Attribute
{
return member.GetCustomAttributes(false).OfType<T>().SingleOrDefault();
}
의 도움으로 다음 달성되는
하지만 다음과 같은 방법으로 액세스 할 수 있기를 바랍니다.
var c = new MyClass();
var attribute = c.GetAttribute<DatabaseIdAttribute>(m => m.Height);
네, 가능하고, 사소한입니다. 너 뭐 해봤 니? – leppie
예, 사소한 것처럼 보이지만 예제를 찾을 수 없습니다. 그래서 내가 여기 물었습니다. –
'object'를 사용하지 마십시오. 그렇지 않으면 변환이 수반됩니다. 추가 일반 매개 변수 (예 :'R')를 사용하십시오. 또한, 멤버는 'PropertyInfo'일 수도 있습니다 (이 경우). 'MemberInfo'는 속성에만 관심이 있다면 여기에서 충분할 것입니다. – leppie