Не удается преобразовать ICollection <t>в IEnumerable <t> - PullRequest
0 голосов
/ 03 сентября 2018

Я строю дерево выражений:

{x => x.principal_info.First (). Agent_for_property_info}

Работает как положено.

На самом деле мне нужно преобразовать его в IEnumerable вместо ICollection, как вы можете видеть здесь.

Вот метод, который работает:

public Expression<Func<T, IEnumerable<K>>> GetGenericExpression<T, K>(bool first = false, params string[] properties)
    {
        var expression = GetNavigationPropertySelector<T, K>(typeof(T), first, properties);

        var expRight = (Expression<Func<T, IEnumerable<K>>>)expression;

        return expRight;
    }

В выражении я получаю правильное лямбда-выражение:

{x => x.principal_info.First (). Agent_for_property_info}

Когда я кастую:

var expRight = (Expression<Func<T, IEnumerable<K>>>)expression;

Я получаю исключение:

Unable to cast object of 
type 
'System.Linq.Expressions.Expression`1[System.Func`2[SomeModel1,
System.Collections.Generic.ICollection`1[SomeModel]]]' 
to type 
'System.Linq.Expressions.Expression`1[System.Func`2[SomeModel1
,System.Collections.Generic.IEnumerable`1[SomeModel]]]'.

Я знал, что ICollection наследуется от IEnumerable, предполагая, что это что-то довольно легко исправить.

Я много исследовал, но не нашел решения, как привести ICollection<T> к IEnumerable<T> или, если это вообще возможно?

Фактически, компилятор может привести его неявно, так как эти строки действительны:

var queryData1 = new QueryData<contact_info, IEnumerable<property_info>>()
                {
                    WhereClause = expression,
                    SelectClause = info => info.principal_info.First().agent_for_property_info
                };

Поскольку это выражение является типом ICollection:

info => info.principal_info.First (). Agent_for_property_info

1 Ответ

0 голосов
/ 03 сентября 2018

После нескольких часов исследований, пробуя разные подходы, я придумал идею, пытаясь преодолеть это исключение. Таким образом, обходной путь, который я использую, был предложением из комментариев:

x => x.principal_info.First (). Agent_for_property_info.Select (x4 => x4)

Вот что я добавил при построении выражения:

var result1 = Expression.Call(
                    typeof(Enumerable), "Select", new Type[] { elementResultType, elementResultType },
                    resultProperty, resultExpr);

На самом деле я не нашел решения, но если кто-то столкнется с такой проблемой, возможно, этот ответ мог бы сэкономить его время.

...