【问题标题】:C# set property value of property passed to method via Func<T>C# 设置通过 Func<T> 传递给方法的属性的属性值
【发布时间】:2014-06-05 10:21:46
【问题描述】:

我使用这个方法来获取方法中某个属性的值:

public static T Decrypt<T>(Func<T> prop, string username, string password)
{
    T value = prop();
    //do cool stuff with t
    return value;
}

我正在寻找另一种方式,设置我的属性的值

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

【问题讨论】:

  • 你能发布set场景的通话代码吗?换句话说:你怎么称呼Decrypt
  • 加密方法必须使用Func&lt;T&gt; 委托还是可以使用其他方法?
  • @Dirk 不,我可以使用不同的
  • 那么我会建议与@WolfgangZiegler 相同的解决方案

标签: c# .net func


【解决方案1】:

你可以像这样更改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, "", "");

【讨论】:

    【解决方案2】:

    你误解了 SetValue 方法的行为方式,它以一个真实的对象作为第一个参数,该参数具有描述 propertyInfo 的属性,所以你需要采用该对象形式的表达式而不是使用表达式本身,请看一下以下关于 stakoverflow 的答案可能会对您有所帮助 link to post

    【讨论】:

      【解决方案3】:

      您可以尝试通过名称设置属性:

      Type t = ctrl.GetType();
      t.InvokeMember(propName, BindingFlags.Instance | BindingFlags.SetProperty |BindingFlags.Public, null, ctrl, new object[] { value });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多