我正在开发一个使用一些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);
}
}
答案 0 :(得分:2)
Attribute.GetCustomAttribute
和PropertyInfo
/ MemberInfo.GetCustomAttribute
是获取属性对象的推荐方式。
虽然,我通常不会枚举具有属性的所有属性;你通常想要工作一个特定的属性,所以你只需要直接调用如果你在任何属性上寻找属性,枚举那些基于GetCustomAttribute()寻找属性的属性你这样做的方式是最好的方法。GetCustomAttribute
。
答案 1 :(得分:1)
在处理属性时没有太多选择 - 你的代码是正确的和合理的,它也不是你主要的性能问题。唯一的直接原因是放弃ToList
电话是绝对不必要的。
附注:与绩效相关的问题应该近似
“我已经测量了我的代码,部分XXX似乎占用了太多时间(YYY)。这段代码的时间目标是ZZZ。我的做法是合理的吗/我在哪里可以改进它?” 。
请注意,在您的情况下,您缺少YYY和ZZZ时间部分 - 因此您无法确定它是否适合您的情况。您可能希望使用DB /其他IO绑定操作开始测量,因为它更有可能加快您的整体代码。
在您认为此属性相关代码是主要性能问题之后,您可以考虑某种结果缓存甚至某种类型的代码生成(通过缓存lambdas来设置必要的值甚至完整的IL生成)。 / p>