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

Posted 秋天的竹子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将Lambda表达式作为参数传递并解析-在构造函数参数列表中使用Lambda表达式相关的知识,希望对你有一定的参考价值。

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表达式的主要内容,如果未能解决你的问题,请参考以下文章

lambda表达式

5Lambda表达式

lambda表达式

C# 将 Lambda 表达式作为方法参数传递

如何将 lambda 表达式作为参数传递给 c++ 模板

如何将运行时参数作为依赖解析的一部分传递?