Как передать параметры в Expression.New ()? - PullRequest
2 голосов
/ 04 февраля 2020

Я использовал этот код для создания скомпилированного выражения, которое создает объект:

var exp = Expression.Lambda<Func<IMyInterface>>(Expression.New(myType)).Compile();
exp();

Но теперь я хочу добавить к нему параметр, в основном конструктор будет печатать SomeObject obj в качестве параметра .

Expression.New() имеет перегрузку для получения параметров. Но я не уверен, как их построить или как передать экземпляр объекта.

Кто-нибудь может помочь?

1 Ответ

1 голос
/ 04 февраля 2020

Вам нужно только создать ParameterExpression, используя Expression.Parameter. Затем используйте другие выражения, такие как 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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...