Объявление типа времени компиляции без использования динамического в C # - PullRequest
0 голосов
/ 21 октября 2019

У меня есть 2 модели, такие как ниже,

public class AClass
{
    public int prop { get; set; }
    public virtual List<BClass> bClass { get; set; }
}

public class BClass
{
    public int prop1 { get; set; }
    public int prop2 { get; set; }
}

Использовали эти модели в запросе linq

var data = testList.GroupBy(e => e.TestProp1).Select(g=> new AClass
{
    prop = g.Key,
    bClass = g.GroupBy(p=> p.TestProp2).Select(g1 => new BClass {
        prop1 = g1.FirstOrDefault().TestProp1,
        prop2 = g1.FirstOrDefault().TestProp2
    }).ToList()
}).ToList();

Теперь существует требование добавить новое свойство prop3 в BClass без влияния на оригинал BClass. Итак, я создал унаследованный CClass и использовал его в linq,

public class CClass : BClass
{
    public int prop3 { get; set; }
}

var data1 = testList.GroupBy(e => e.TestProp1).Select(g=> new AClass
{
    prop = g.Key,
    bClass = g.GroupBy(p=> p.TestProp2).Select(g1 => new CClass {
        prop1 = g1.FirstOrDefault().TestProp1,
        prop2 = g1.FirstOrDefault().TestProp2
    }).ToList()
}).ToList();

В этом сценарии bClass = g.GroupBy(p => p.TestProp2, (key1, g1) => new CClass строка, выдающая ошибку, Cannot implicitly convert type 'System.Collections.Generic.List<TestApp.CClass>' to 'System.Collections.Generic.List<TestApp.BClass>'

* Решение, которое я пробовал: *

Я заменил следующую строку с AClass

public virtual List<BClass> bClass { get; set; }`

на

public virtual dynamic bClass { get; set; }

это сработало.

Но, простодля любопытства, не объявляя это как динамическое свойство, как я могу достигнуть этого?

1 Ответ

3 голосов
/ 21 октября 2019

Нет необходимости использовать dynamic вообще. Вам просто нужно сообщить компилятору, что вы хотите BClass от второго вызова Select:

var data1 = testList.GroupBy(e => e.TestProp1).Select(g=> new AClass
{
    prop = g.Key,
    // this line here! Note the cast
    bClass = g.GroupBy(p=> p.TestProp2).Select(g1 => (BClass)(new CClass {
        prop1 = g1.FirstOrDefault().TestProp1,
        prop2 = g1.FirstOrDefault().TestProp2,
        prop3 = ... // why don't you also set prop3?

    })).ToList()
}).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...