2013-03-25 117 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; 
相关问题