Как использовать класс Pass Generics в качестве параметра с методами типа ограничения - PullRequest
0 голосов
/ 17 октября 2019

Я все еще пытаюсь полностью понять дженерики, особенно когда они используются в сочетании с базовыми классами. У меня есть универсальный табличный класс, который принимает производный тип класса строки, но ограничен, чтобы быть базовой строкой. Поскольку класс базовой таблицы является ограничением для взятия базовой строки типа, как я могу передать этот класс любому производному классу, имеющему базовый тип строки.

public interface Itable<in TRow>  where TRow : row{
    //*This will not compile with the list of TRow should it be List<row>? If so how do i force that conversion?
    List<TRow> IfindLst();
}
public abstract class table<TRow> where TRow : row, Itable<row>
{
    //*This is the list of rows i want to be able to send as their base row 
    public List<TRow> derivedRowLst = new List<TRow>();
    public table()
    {

    }
    public List<row> IfindLst()
   {
       return derivedRowLst;
   }
}
//Derive instance of base table class
public class tableInstOne : table<rowInstOne>
{

}
//Base class for row that all derived rows are guarantee to be of
public abstract class row
{

}
public class rowInstOne : row
{
    public rowInstOne() { }
}
public class tester
{
    public static void main()
    {
        Itable<row> tblInstOne = new tableInstOne();
        //*This is what I am trying to figure out how to do get this list of base row class from the base table class. Even though it is stored as List<TRow> or derived row class. 
        List<row> baseLst = tblInstOne.IfindLst();
    }

}

Это не позволяет мне отправлять экземпляр класса таблицы как имеющий базовый гарантированный тип. Раньше у меня не было общего табличного класса, поэтому все строки просто использовались в качестве базовой строки, но для этого требовалось уменьшить значение в других точках кода, которых я пытаюсь избежать. Теперь мне не нужно преуменьшать, НО я не могу отправить этот класс таблицы с основанием в качестве параметра классам, которые не заботятся о производном типе строки и нуждаются только в использовании базовых функций строки. Спасибо за любую помощь!

1 Ответ

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

Трудно точно сказать, чего вы пытаетесь достичь. Возможно, следующий код поможет. Обратите внимание, что метод IfindLst возвращает List<TRow>, а не List<Row>, что, я думаю, может быть частью вашей проблемы.

public abstract class Table<TRow> where TRow : Row
{
    //*This is the list of rows i want to be able to send as their base row 
    public List<TRow> derivedRowLst = new List<TRow>();
    public Table()
    {

    }
    public List<TRow> IfindLst()
    {
       return derivedRowLst;
    }
}
//Derive instance of base table class
public class TableInstOne : Table<RowInstOne>
{

}
//Base class for row that all derived rows are guarantee to be of
public abstract class Row
{

}
public class RowInstOne : Row
{
    public RowInstOne() { }
}

public static class Program
{
    public static void Main(string[] args)
    {
        Table<RowInstOne> tblInstOne = new TableInstOne();
        //*This is what I am trying to figure out how to do get this list of base row class from the base table class. Even though it is stored as List<TRow> or derived row class. 
        List<Row> baseLst = tblInstOne.IfindLst().OfType<Row>().ToList();
        List<Row> baseLst2 = tblInstOne.IfindLst().ConvertAll(x => (Row)x);
        List<Row> baseLst3 = tblInstOne.IfindLst().Cast<Row>().ToList();
        IEnumerable<Row> baseLst3 = tblInstOne.IfindLst();
    }
}

Обратите внимание, что в последней строке я демонстрирую использование ковариантаIEnumerable<T> интерфейс, чтобы избежать приведения типов или проверки типов во время выполнения.

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