访问属性的最佳方式
我正在研究使用某些Attribute标记的框架。 这将在MVC项目中使用,并且大致每次在视图中查看特定记录时都会发生(例如/ Details / 5)
我想知道是否有更好/更有效的方式来做到这一点或一个好的最佳实践的例子。
无论如何,我有一些属性,例如:
[Foo("someValueHere")]
String Name {get;set;}
[Bar("SomeOtherValue"]
String Address {get;set;}
寻找这些属性/行为的最有效方式/最佳实践是什么?
我目前正在做这样的事情:
[System.AttributeUsage(AttributeTargets.Property)]
class FooAttribute : Attribute
{
public string Target { get; set; }
public FooAttribute(string target)
{
Target = target;
}
}
在我的方法中,我对这些属性采取行动(简化示例!):
public static void DoSomething(object source)
{
//is it faster if I make this a generic function and get the tpe from T?
Type sourceType = source.GetType();
//get all of the properties marked up with a foo attribute
var fooProperties = sourceType
.GetProperties()
.Where(p => p.GetCustomAttributes(typeof(FooAttribute), true)
.Any())
.ToList();
//go through each fooproperty and try to get the value set
foreach (var prop in fooProperties)
{
object value = prop.GetValue(source, null);
// do something with the value
prop.SetValue(source, my-modified-value, null);
}
}
Attribute.GetCustomAttribute
和PropertyInfo
/ MemberInfo.GetCustomAttribute
是获取属性对象的推荐方式。
虽然,我通常不会列举所有属性; 您通常需要处理特定属性,以便直接调用GetCustomAttribute
如果您正在查找任何属性的属性,那么按照您的方式枚举基于GetCustomAttribute()查找属性的属性,是最好的方式来做到这一点。
在处理属性时没有太多的选择 - 你的代码是正确合理的,作为你的主要性能问题也是不可取的。 唯一直接的就是放弃ToList
调用,因为绝对没有必要。
附注:性能相关的问题应该近似
“我测量了我的代码,XXX部分似乎花费了太多时间(YYY)。这段代码的时间目标是ZZZ,我的方法是使XXX合理吗?我可以在哪里改进它?”
请注意,在你的情况下,你缺少YYY和ZZZ时间部分 - 所以你不能真正说出你的情况是否缓慢。 而且您可能想要使用DB /其他IO绑定操作开始测量,因为它更有可能加速您的整体代码。
在你认为这个属性相关的代码是主要的性能问题之后,你可以考虑对结果进行某种缓存或者某种类型的代码生成(通过缓存设置必要值的lambda或甚至全面生成IL代码)。
链接地址: http://www.djcxy.com/p/11175.html