访问属性的最佳方式

我正在研究使用某些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.GetCustomAttributePropertyInfo / MemberInfo.GetCustomAttribute是获取属性对象的推荐方式。

虽然,我通常不会列举所有属性; 您通常需要处理特定属性,以便直接调用GetCustomAttribute如果您正在查找任何属性的属性,那么按照您的方式枚举基于GetCustomAttribute()查找属性的属性,是最好的方式来做到这一点。


在处理属性时没有太多的选择 - 你的代码是正确合理的,作为你的主要性能问题也是不可取的。 唯一直接的就是放弃ToList调用,因为绝对没有必要。


附注:性能相关的问题应该近似

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

请注意,在你的情况下,你缺少YYY和ZZZ时间部分 - 所以你不能真正说出你的情况是否缓慢。 而且您可能想要使用DB /其他IO绑定操作开始测量,因为它更有可能加速您的整体代码。

在你认为这个属性相关的代码是主要的性能问题之后,你可以考虑对结果进行某种缓存或者某种类型的代码生成(通过缓存设置必要值的lambda或甚至全面生成IL代码)。

链接地址: http://www.djcxy.com/p/11175.html

上一篇: Best way to access attributes

下一篇: Can [XmlText] serialization be nullable?