码迷,mamicode.com
首页 > 其他好文 > 详细

将Lambda表达式作为参数传递并解析-在构造函数参数列表中使用Lambda表达式

时间:2017-05-12 20:22:42      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:工具   val   为我   ring   opera   nan   activator   tail   赋值   

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接口。 
至于具体如何实现,我得在下一篇文章中详述了。

转载来源 http://blog.csdn.net/honantic/article/details/50778014

将Lambda表达式作为参数传递并解析-在构造函数参数列表中使用Lambda表达式

标签:工具   val   为我   ring   opera   nan   activator   tail   赋值   

原文地址:http://www.cnblogs.com/swfpt/p/6846706.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!