Как хранить Expression > в поле класса? - PullRequest
0 голосов
/ 15 января 2020

Я хотел бы сохранить Expression в поле класса для последующего использования.

Вот что я пытаюсь сделать:

public class MyClass
{
    private Expression<Func<Type, object>> _expression;

    public void SetExpression<T>(Expression<Func<T, object>> expression)
    {
        _expression = expression;
    }
}

Ответы [ 3 ]

2 голосов
/ 15 января 2020

Как указано в комментарии к исходному вопросу @ canton7, вы используете <T> и Type, но это не одно и то же.

Возможное решение для этого будет следующим:

public class MyClass<T>
{
    private Expression<Func<T, object>> _expression;

    public void SetExpression<T>(Expression<Func<T, object>> expression)
    {
        _expression = expression;
    }
}

Используя этот подход, вам нужно будет создать классы, используя следующее

new MyClass<String>();

Это приведет к тому, что _expression будет иметь тип Expression<Func<String, object>>.

Если вы не можете установить T для указанного типа c при создании объекта, вам нужно будет передать выражение непосредственно в метод, в котором вы хотите его использовать, либо в этом, либо сделать тип фиксированным для сохраненного выражения.

0 голосов
/ 15 января 2020

Либо создайте обобщенный c класс:

public class MyClass<T>
{
    private Expression<Func<T, object>> _expression;

    public void SetExpression(Expression<Func<T, object>> expression)
    {
        _expression = expression;
    }
}

Или используйте более «абстрактное» выражение:

public class MyClass
{
    private Expression<Func<object, object>> _expression;

    public void SetExpression(Expression<Func<object, object>> expression)
    {
        _expression = expression;
    }
}

В обоих случаях, если вы работаете с типом ввода - вы можете получить его, используя входные аргументы выражения:

 var inputTypesWhichIWantedToBeGeneric = _expression.Parameters.Select(x=> x.Type);
0 голосов
/ 15 января 2020

Эй, это то, чего ты хочешь достичь?

public class MyClass<T>
    {
        private Expression<Func<T, object>> _expression;

        public void SetExpression(Expression<Func<T, object>> expression)
        {
            _expression = expression;
        }
    }
...