Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.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# 如何将参数传递给Expression.New()?_C#_Lambda - Fatal编程技术网

C# 如何将参数传递给Expression.New()?

C# 如何将参数传递给Expression.New()?,c#,lambda,C#,Lambda,我使用这段代码创建了一个编译表达式来构造一个对象: var exp = Expression.Lambda<Func<IMyInterface>>(Expression.New(myType)).Compile(); exp(); var exp=Expression.Lambda(Expression.New(myType)).Compile(); exp(); 但是现在我想给它添加一个参数,基本上构造函数将键入someobjectobj作为参数 Expressio

我使用这段代码创建了一个编译表达式来构造一个对象:

var exp = Expression.Lambda<Func<IMyInterface>>(Expression.New(myType)).Compile();
exp();
var exp=Expression.Lambda(Expression.New(myType)).Compile();
exp();
但是现在我想给它添加一个参数,基本上构造函数将键入
someobjectobj
作为参数

Expression.New()。但是我不知道如何构建它们,或者如何传入对象实例


有人能帮忙吗?

您只需使用
Expression.Parameter
创建一个
ParameterExpression
。然后使用其他表达式,如
ConstantExpression
BinaryExpression

这只是一个简单的例子:

class Program
{
    static void Main(string[] args)
    {
        var lambda = LambdaExpressionWithParameters();

        MyClass1 c1 = new MyClass1() { Name = "Hans" };
        MyClass2 c2 = new MyClass2() { Name = "Peter", Value = 42 };
        var b1 = lambda.DynamicInvoke(c1);
        var b2 = lambda.DynamicInvoke(c2);
    }

    static Delegate LambdaExpressionWithParameters()
    {
        ParameterExpression pex = Expression.Parameter(typeof(IMyInterface));//IMyInterface as Parameter 

        ConstantExpression cex = Expression.Constant("Peter");//Constant "Peter"
        MemberExpression mex = Expression.PropertyOrField(pex, "Name");//Property Name of IMyInterface
        BinaryExpression bex = Expression.Equal(mex, cex);

        return Expression.Lambda(bex, pex).Compile();
    }
}

class MyClass1 : IMyInterface
{
    public string Name { get; set; }
}

class MyClass2 : IMyInterface
{
    public string Name { get; set; }
    public int Value { get; set; }
}

public interface IMyInterface
{
    string Name { get; set; }
}

您正在尝试传递对现有对象的引用吗?如果不是Expression.New(Type Type)将调用指定类型的无参数构造函数,但是需要注意的是,这将创建一个新的对象实例,在这里可能不合适,但为了帮助我,我想我需要做更多的细化。嗯,google返回关于SO fo“Expression.New”C#passing parameters的答案(第一个结果中的答案中有一个使用表达式的解决方案)Microsoft Docs指的是传递我在上面提到的类型的重载。应该注意的是,这仅在创建新对象实例时才起作用。我仍在搜索符合您要求的任何内容。不过,我脑子里想不起来什么。