我有一個接受任何對象的函數,然後它從它作爲輸入的屬性或字段中獲取值。關於ComponentModel和Reflection
目前,它看起來像這樣:
private string GetFieldValue(object o, Field f)
{
//field.name is name of property or field
MemberInfo[] mi = o.GetType().GetMember(field.name, MemberTypes.Field | MemberTypes.Property,
BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.ExactBinding);
if (mi.Length == 0) throw new ArgumentException("Field", "Can't find member: " + f.name);
Object value;
if (mi[0].MemberType == MemberTypes.Property)
value = ((PropertyInfo)mi[0]).GetValue(o, null);
else value = ((FieldInfo)mi[0]).GetValue(o);
今天我讀到System.ComponentModel及其XXXDescriptor類。 性能問題時,兩個框架之間有什麼區別(Reflection & ComponentModel)。將使用ComponentModel重寫上述內容會獲得更好的性能還是靈活性?我知道的那兩個唯一的另一個區別是CM支持虛擬屬性。
Ty。
TypeDescriptor實際上並不比stanadrd反射做更多的緩存 - 主要的瓶頸是調用,這是緩慢的。但請參閱我的回覆以瞭解如何改進(使用ComponentModel進行定製)。 – 2009-05-05 12:48:01
我一直認爲TypeDescriptor已被緩存(TypeDescriptor類中的MSDN頁面具有「屬性和事件由TypeDescriptor緩存以提高速度」),而反射解析程序集元數據。 – 2009-05-05 12:53:55
是不是反映兌現MemberInfo已經? 來自MSDN:「MemberInfo緩存在.NET Framework 2.0中被延遲填充,這意味着更低的工作集成本和更少的檢索時間。如果知道要獲取的特定方法的名稱,請使用非 - 多種GetXX方法。「 – majkinetor 2009-05-05 13:01:16