C# 访问属性的最佳方式

C# 访问属性的最佳方式,c#,.net,reflection,attributes,annotations,C#,.net,Reflection,Attributes,Annotations,我正在开发一个使用一些属性标记的框架。这将在MVC项目中使用,并且几乎每次我在视图中查看特定记录时都会出现(例如/Details/5) 我想知道是否有更好/更有效的方法来做到这一点,或者有一个好的最佳实践示例 无论如何,我有两个特点,例如: [Foo("someValueHere")] String Name {get;set;} [Bar("SomeOtherValue"] String Address {get;set;} 寻找这些属性/根据其价值行事的最有效方式/最佳实践是什么 我目前

我正在开发一个使用一些属性标记的框架。这将在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;
    }
}
在我的方法中,我对这些属性进行操作(简化示例!):


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


虽然,我通常不会用属性枚举所有属性;您通常需要处理特定属性,因此只需直接调用
GetCustomAttribute
。如果要查找任何属性上的属性,请按照您的方式枚举那些基于GetCustomAttribute()查找属性的属性,这是最好的方法。

在处理属性时,实际上没有太多的选择-您的代码是合理的,但它也不可能是您主要的性能问题。唯一直接的事情是放弃
ToList
调用,因为它是绝对不必要的


旁注:性能相关问题应大致如下

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

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


在你发现这个与属性相关的代码是主要的性能问题之后,你可以考虑一些缓存的结果,甚至是某种代码的生成(或者通过缓存lambdas来设置必要的值,甚至是完整的IL生成)。为什么太慢了?对不起--我想我应该先说一下:我是从一台真正古老的机器开始编写C代码的,所以当我一直在迭代这些集合时,我感到内疚。我想知道是否有更好的方法来做这一切。我将广泛使用它,并希望确保我做得正确。看起来。我敢打赌,在这里进行的任何优化都不会有回报,尤其是对于一个web项目。即使我错了,(我不是说写不好的代码,但有一点是,与购买周期相比,压缩更多周期的编码是昂贵的)。抱歉,如果我有点慢,当你说直接调用GetCustomAttribute时,我仍然需要获取我首先检查的对象的所有属性,以查看哪些属性具有特定的属性权限?ToList()保留为实际方法的一部分,而实际方法只做了一点点。我需要a)获取所有属性的列表,然后:对不包含Foo注释的属性执行任务a,对包含Foo注释的属性执行任务B。我使用ToList()和.Except()来分隔这个。不确定这是否仍然正确,对,我不认为它是慢的,我以前没有做过这种事情,我想确保我做的事情不会比需要的慢一个数量级。谢谢你的邀请feedback@Yablargo比考虑不使用“最快”的标题在未来——“正确”、“首选”、“推荐”都不意味着你需要提高性能。有点后悔;)

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);
     }
 }