C#设置通过Func <t> </t>传递给方法的属性的属性值

时间:2014-06-05 10:21:47

标签: c# .net func

我使用此方法获取方法中属性的值:

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);
}

3 个答案:

答案 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 });