Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建表达式<;Func<;T、 对象>&燃气轮机;反射变化_C#_Reflection_Lambda - Fatal编程技术网

C# 创建表达式<;Func<;T、 对象>&燃气轮机;反射变化

C# 创建表达式<;Func<;T、 对象>&燃气轮机;反射变化,c#,reflection,lambda,C#,Reflection,Lambda,我创建了以下类: public class Person { public string FirstName { get; set; } public string LastName { get; set; } } 我可以将以下语句设置为方法参数: myClass.SetFieldName<Person>(p => p.LastName); myClass.SetFieldName(p=>p.LastName); 参数的类型为: Expression&

我创建了以下类:

public class Person
{
     public string FirstName { get; set; }
     public string LastName { get; set; }
}
我可以将以下语句设置为方法参数:

myClass.SetFieldName<Person>(p => p.LastName);
myClass.SetFieldName(p=>p.LastName);
参数的类型为:

Expression<Func<Person, object>>
表达式
现在我试图完成的是为反射找到的属性调用SetFieldName方法。假设我有一个PropertyInfo的实例(Person.LastName)。我尝试使用Lambda方法创建表达式,但失败了

如果你能帮我,那就太好了

问候,,
Koray

您只需要稍微扩展一下flem的答案:

using System;
using System.Linq.Expressions;
using NUnit.Framework;

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public static class ExpressionBuilder
{
    public static Expression<Func<TClass, TProperty>> Build<TClass, TProperty>(string fieldName)
    {
        var param = Expression.Parameter(typeof(TClass));
        var field = Expression.PropertyOrField(param, fieldName);
        return Expression.Lambda<Func<TClass, TProperty>>(field, param);
    }
}

[TestFixture]
public class Test
{
    [Test]
    public void TestExpressionBuilder()
    {
        var person = new Person { FirstName = "firstName", LastName = "lastName" };
        var expression = ExpressionBuilder.Build<Person, string>("FirstName");

        var firstName = expression.Compile()(person);

        Assert.That(firstName, Is.EqualTo(person.FirstName));
    }
}
使用系统;
使用System.Linq.Expressions;
使用NUnit.Framework;
公共阶层人士
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}
公共静态类ExpressionBuilder
{
公共静态表达式生成(字符串字段名)
{
var param=Expression.Parameter(typeof(TClass));
var field=Expression.PropertyOrField(参数,字段名);
返回表达式.Lambda(字段,参数);
}
}
[测试夹具]
公开课考试
{
[测试]
public void TestExpressionBuilder()
{
var person=newperson{FirstName=“FirstName”,LastName=“LastName”};
var expression=ExpressionBuilder.Build(“FirstName”);
var firstName=expression.Compile()(person);
Assert.That(firstName,Is.EqualTo(person.firstName));
}
}
公共静态类LambdaExpressionExtensions
{
公共静态表达式ToUntypedPropertyExpression(此表达式)
{
var memberName=((MemberExpression)expression.Body).Member.Name;
var param=Expression.Parameter(typeof(TInput));
var field=Expression.Property(参数,memberName);
返回表达式.Lambda(字段,参数);
}
}

Hi,我需要将创建的表达式作为参数传递给SetFieldName方法。但是您创建的表达式是Expression类型,它与Expression不兼容。问题是如何从反射找到的
PropertyInfo
创建
表达式(您将其作为参数接受,从而将其视为黑盒)。根据我所知,上面的构建()方法仅适用于TClass对象的顶级属性。如果试图传递子属性表达式,则PropertyOrField调用将失败。它不处理在对象路径上行走的问题。例如,如果您有一个Address对象,并且Person类有一个Address类型的属性“PrimaryAddress”,则无法传入“PrimaryAddress.PostalCode”。
using System;
using System.Linq.Expressions;
using NUnit.Framework;

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public static class ExpressionBuilder
{
    public static Expression<Func<TClass, TProperty>> Build<TClass, TProperty>(string fieldName)
    {
        var param = Expression.Parameter(typeof(TClass));
        var field = Expression.PropertyOrField(param, fieldName);
        return Expression.Lambda<Func<TClass, TProperty>>(field, param);
    }
}

[TestFixture]
public class Test
{
    [Test]
    public void TestExpressionBuilder()
    {
        var person = new Person { FirstName = "firstName", LastName = "lastName" };
        var expression = ExpressionBuilder.Build<Person, string>("FirstName");

        var firstName = expression.Compile()(person);

        Assert.That(firstName, Is.EqualTo(person.FirstName));
    }
}
public static class LambdaExpressionExtensions
{
    public static Expression<Func<TInput, object>> ToUntypedPropertyExpression<TInput, TOutput> (this Expression<Func<TInput, TOutput>> expression)
    {
        var memberName = ((MemberExpression)expression.Body).Member.Name;

        var param = Expression.Parameter(typeof(TInput));
        var field = Expression.Property(param, memberName);
        return Expression.Lambda<Func<TInput, object>>(field, param);
    }
}