将Lambda表达式作为参数传递并解析——在构造函数参数列表中使用Lambda表达式(C#)

本文介绍了一种使用Lambda表达式为对象属性赋值的方法,并对比了传统构造函数初始化方式,探讨了其实际意义及在WPF开发中的潜在应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话不多说,先上代码:
public class DemoClass 
{
    /// <summary>
    /// 通过Lambda表达式,在构造函数中赋初始值
    /// </summary>
    /// <param name="propertyFunc"></param>
    /// <param name="propertyValue"></param>
    public DemoClass (Expression<Func<CustomerBasicInfo, object>> propertyFunc, object propertyValue)
    {
        #region 就是这段代码来捕捉Lambda表达式对象并解析的
        //var propertyName = (((propertyFunc.Body as UnaryExpression).Operand as MemberExpression).Member as PropertyInfo).Name;//利用VS跟踪工具获得的RunTimeExpression转换过来的方法
        var propertyName = ((propertyFunc.Body as UnaryExpression).Operand as MemberExpression).Member.Name;//简化后的方法
        #endregion


        PropertyInfo[] props = this.GetType().GetProperties();
        try
        {
            foreach (PropertyInfo p in props)
            {
                if (p.SetMethod != null)
                {
                    object value;
                    if (p.Name.Equals(propertyName))
                    {
                        value = Convert.ChangeType(propertyValue, p.PropertyType);
                    }
                    else
                    {
                        Type t = p.PropertyType;
                        value = t.IsValueType ? Activator.CreateInstance(t) : (t.Name.ToLower().Equals("string") ? string.Empty : null);
                    }
                    p.SetValue(this, value);
                }
            }
        }
        catch (Exception)
        {
            throw;
        }
    }
}

上面这段代码主要实现了这样一个功能:通过Lambda表达式,在初始化对象实例的时候,为指定的属性赋值
简单地说,上面的方法调用方式以及结果如下:
DemoClass dc = new DemoClass (s => s.Name, “李四”);
Console.WriteLine(dc.Name);//输出 李四


朋友们可能已经发现,这样的做法无异于:脱裤子放屁,多此一举
因为我们可以通过以下的写法实现相同的目的,而不需要写任何多余的代码:
DemoClass dc = new DemoClass () { Name =“李四”};


那么,这样做有什么意义呢?
其实,在构造函数中使用Lambda表达式作为参数,这件事情本身并没有什么太大的意义,但是它至少让我在Lambda表达式的使用方面有了更多了解。
并且在写代码的过程中我受到启发,发现利用Lambda表达式,可以优雅地实现WPF中的INotificationChanged接口
至于具体如何实现,我得在下一篇文章中详述了。


如果各位大神有任何高见,请不要吝惜金口,我虚心聆听。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值