我使用此方法获取方法中属性的值:
public static T Decrypt<T>(Func<T> prop, string username, string password)
{
T value = prop();
//do cool stuff with t
return value;
}
我正在寻找一种方法来做另一种方式arround,设置我的属性的值
public static void Encrypt<T>(Func<T> prop, T value, string username, string password)
{
//do stuff with value
??? set prop ???
}
我已经搜索并尝试过表达式,但云无法让它工作:
public static void Encrypt<T>(Expression<Func<T>> property, T value, string username, string password)
{
//do stuff with value
var propertyInfo = ((MemberExpression)property.Body).Member as PropertyInfo;
propertyInfo.SetValue(property, value);
}
答案 0 :(得分:6)
您可以像这样更改Encrypt
功能:
public static void Encrypt<T>(Action<T> prop, T value, string username, string password)
{
// awesome stuff before
prop(value);
// awesome stuff after
}
然后拨打Encrypt
:
Encrypt(value => obj.Prop = value, 23, "", "");
答案 1 :(得分:0)
你误解了SetValue方法的行为,它将一个真实对象作为第一个参数,它具有描述propertyInfo的属性,所以你需要采用该对象形式表达而不是使用表达式本身,请看一下关于stakoverflow的以下答案可能对您有所帮助 link to post
答案 2 :(得分:0)
您可以尝试按名称设置属性:
Type t = ctrl.GetType();
t.InvokeMember(propName, BindingFlags.Instance | BindingFlags.SetProperty |BindingFlags.Public, null, ctrl, new object[] { value });