2016-02-08 96 views
1

說我有一個函數設置屬性如何設置該屬性上的記錄如何使用FUNC <>

public void SetProperty<TRecord, TEnum>(TRecord item, 
             Func<TRecord, TEnum> property, string enumValue) 
    where TEnum : struct 
    where TRecord : class 
{ 
    TEnum enumType; 
    if (Enum.TryParse(enumValue, true, out enumType)) 
    { 
     //How Do I set this? 
     property.Invoke(item) = enumType; 
    } 
} 

我不希望這個切換到一個表達式。有人知道如何設置屬性嗎?

+3

這是完全不可能的。給定一個代表(您假設)調用屬性獲取器,則無法獲取setter。 – SLaks

+1

你想解決什麼問題?不要向我們展示您對某個未知問題提出的解決方案,請告訴我們問題是什麼,並且我們會找出解決方法。 –

+0

@SLaks我必須改變以獲得setter?傳遞一個動作,使用反射或表達式樹? –

回答

5
public void SetProperty<TRecord, TEnum>(TRecord item, 
           Action<TRecord, TEnum> property, string enumValue) 
    where TEnum : struct 
    where TRecord : class 
{ 
    TEnum enumType; 
    if (Enum.TryParse(enumValue, true, out enumType)) 
    { 
     property(item, enumType); 
    } 
} 

更好的辦法...

public TEnum? AsEnum<TEnum>(string enumValue) 
    where TEnum : struct 
{ 
    TEnum enumType; 
    if (Enum.TryParse(enumValue, true, out enumType)) 
    { 
     return enumType; 
    } 
    return default(TEnum); 
} 

用法示例...

myObj.Prop = AsEnum<MyEnum>("value") ?? MyEnum.Default; 
//versus 
SetPropery<MyObject, MyEnum>(myobj, (r, e) => r.Prop = e, "value"); 
+1

沒有使用'表達'(OP表示他想避免),這是唯一的方法做到這一點。然而,它使得調用代碼變得更加複雜,這是因爲它引入了第二個lambda參數,並且因爲不能再隱式推斷泛型「TEnum」類型。 – StriplingWarrior

+1

我不反對......基於他的要求的模式並不漂亮。 –

+0

這完美謝謝! –

相關問題