访问属性的最佳方式

时间:2012-09-05 03:50:25

标签: c# .net reflection attributes annotations

我正在开发一个使用一些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);
     }
 }

2 个答案:

答案 0 :(得分:2)

Attribute.GetCustomAttributePropertyInfo / MemberInfo.GetCustomAttribute是获取属性对象的推荐方式。

虽然,我通常不会枚举具有属性的所有属性;你通常想要工作一个特定的属性,所以你只需要直接调用GetCustomAttribute如果你在任何属性上寻找属性,枚举那些基于GetCustomAttribute()寻找属性的属性你这样做的方式是最好的方法。

答案 1 :(得分:1)

在处理属性时没有太多选择 - 你的代码是正确的和合理的,它也不是你主要的性能问题。唯一的直接原因是放弃ToList电话是绝对不必要的。


附注:与绩效相关的问题应该近似

  

“我已经测量了我的代码,部分XXX似乎占用了太多时间(YYY)。这段代码的时间目标是ZZZ。我的做法是合理的吗/我在哪里可以改进它?” 。

请注意,在您的情况下,您缺少YYY和ZZZ时间部分 - 因此您无法确定它是否适合您的情况。您可能希望使用DB /其他IO绑定操作开始测量,因为它更有可能加快您的整体代码。

在您认为此属性相关代码是主要性能问题之后,您可以考虑某种结果缓存甚至某种类型的代码生成(通过缓存lambdas来设置必要的值甚至完整的IL生成)。 / p>