C# 访问属性的最佳方式
我正在开发一个使用一些属性标记的框架。这将在MVC项目中使用,并且几乎每次我在视图中查看特定记录时都会出现(例如/Details/5) 我想知道是否有更好/更有效的方法来做到这一点,或者有一个好的最佳实践示例 无论如何,我有两个特点,例如: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;} 寻找这些属性/根据其价值行事的最有效方式/最佳实践是什么 我目前
[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);
}
}