2016-02-08 55 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

这完美谢谢! –

相关问题