7

我正在开发一个使用一些属性标记的框架。这将在 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);
     }
 }
4

2 回答 2

2

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

虽然,我通常不会枚举所有具有属性的属性;您通常希望使用特定属性,因此您只需GetCustomAttribute直接调用即可。如果您正在寻找任何属性的属性,那么枚举那些属性以查找基于 GetCustomAttribute() 的属性,这是最好的方法。

于 2012-09-05T03:56:15.243 回答
1

处理属性时没有太多选择 - 你的代码是好的和合理的,它也不太可能成为你主要的性能问题。唯一直接的事情是ToList完全没有必要挂断电话。


旁注:与性能相关的问题应该看起来差不多

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

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

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

于 2012-09-05T04:38:19.337 回答