2013-03-25 118 views
1

C#4.0。我有一個緩慢屬性具有屬性。我想不調用吸氣閱讀此屬性:在不調用getter的情況下讀取屬性屬性?

[Range(0.0f, 1000.0f)] 
public float X 
{ 
    get 
    { 
     return SlowFunctionX(); 
    } 
} 

這是我現在有:

public static T GetRangeMin<T>(T value) 
{ 
    var attribute = value.GetType() 
     .GetField(value.ToString()) 
     .GetCustomAttributes(typeof(RangeAttribute), false) 
     .SingleOrDefault() as RangeAttribute; 

    return (T)attribute.Minimum; 
} 

var min = GetRangeMin<double>(X); // Will call the getter of X :(

問:我如何讀取無需調用的X吸氣這個屬性?

+0

這可能有幫助..類似的問題http://stackoverflow.com/questions/6637679/reflection-get-attribute-name-and-value-on-property/6637710#6637710 – Amitd 2013-03-25 17:21:34

回答

1

你將無法得到它這樣的,無論如何,因爲你將調用像GetRangeMin<float>(0.0f)和浮子式沒有一個叫做whatever-value-X-has的字段。

如果你想要做一個一般類型安全的方式,你需要使用表達式:

public static T GetRangeMin<T>(Expression<Func<T>> value) 

從而調用:

var min = GetRangeMin(() => X); 

然後,您需要導航表達式樹獲取屬性信息

MemberExpression memberExpression = value.Body as MemberExpression; 
if (null == memberExpression || memberExpression.Member.MemberType != MemberTypes.Property) 
    throw new ArgumentException("Expect a field access", "FieldExpression"); 
PropertyInfo propInfo = (PropertyInfo)memberExpression.Member; 

現在,您可以GetCustomAttributespropInfo。就像旁人一樣,如果你擔心繼承問題,你可能需要使用Attribute.GetCustomAttributes(propInfo, ...),因爲即使你問了,propInfo.GetCustomAttributes(...)也不會繼承樹。

9

要閱讀的財產屬性只是加載屬性直接

var attrib = typeof(TheTypeContainingX) 
    .GetProperty("X") 
    .GetCustomAttributes(typeof(RangeAttribute), false) 
    .Cast<RangeAttribute>() 
    .FirstOrDefault(); 
return attrib.Minimum; 
相關問題