2009-07-07 138 views
1

我正在爲我的應用程序編寫一個文件通用塊,並開始使用Lambda表達式來管理我的規則集以生成塊,以避免魔法字符串,配置地獄等陷阱。用lambda表達式讀取屬性值

在我的映射類我有類似線路:

Map(x => x.Name).Length(20).PadLeft(true).PaddingChar("#"); 

能正常工作,而不是在我的居住問題,在這裏我設置救了我的關於表達的信息是在地圖的方法:

public override IPropertyMap Map(Expression<Func<T, object>> expression) 
{ 
    var propertyMap = new FixedLengthPropertyMap 
      { 
       //Length = 20, 
       //PaddingCharacter = " ", 
       PadLeft = false, 
       PropertyInfo = ReflectionHelper.GetProperty(expression) 
      }; 

    _properties.Add(propertyMap); 

    return propertyMap; 
} 

_properties只是一個List<IPropertyMap>存儲我的信息,其中從什麼是有一個真正的對象的數據可以從屬性讀過的最好的方式,我的問題目前我想出了一些與此類似:

var map = new AgentMap(); 
var agent = new Agent {Name = "Bob"}; 

string output = map.Write(agent); 

public override string Write<T>(T agent) 
{ 
    var initial = _properties[0]; 
    return initial.PropertyInfo.GetValue(agent, null) as string; 
} 

是有一種比使用GetValue方法更好的方法,因爲之前我使用表達式樹?

+0

-1我很害怕看到你的反射幫手。 – asyncwait 2009-08-18 14:49:27

回答

1

我不明白你爲什麼真的需要使用表達式樹。只是使Map方法採取Func<T, object>和存儲:

public override IPropertyMap Map(Func<T, string> fetcher) 
{ 
    var propertyMap = new FixedLengthPropertyMap 
      { 
       //Length = 20, 
       //PaddingCharacter = " ", 
       PadLeft = false, 
       Delegate = fetcher // Delegate is of type Delegate 
      }; 

    _properties.Add(propertyMap); 

    return propertyMap; 
} 

然後:

public override string Write<T>(T agent) 
{ 
    var initial = _properties[0]; 
    Func<T, string> fetcher = (Func<T, string>) initial.Delegate; 
    return fetcher(agent); 
} 

你有什麼特別想知道的財產和使用表達式樹的原因嗎?

+0

如果我需要訪問PropertyInfo信息(可能用於不同類型的對話/解析),或者如果我想創建基於命名風格的某種類型的默認規則,那麼我開始將它保留爲表達式樹的唯一原因是稍後屬性/類型。 – 2009-07-07 19:47:36

1

部分取決於你的場景。 「簡單」的答案是隻編譯表達式並調用它,但如果你在一個緊密的循環中進行操作(通過委託會更快),那麼這會對性能產生潛在的影響。

我不知道是否會如在此特別案件,不適用(因爲agent),但避免做過多的表情編輯,你可以看看簡單的場景,並直接從表達式樹讀取值;的PropertyInfo/FieldInfo一點點的將是比編譯它快......

更多,看TryEvaluatehere,以及它是如何使用Compile作爲一個備份策略(儘管你有一個已知的優勢委託類型)。