我是否必须在我的抽象类中传递我的T才能使用它,我可以使用self / this

时间:2017-05-22 15:00:43

标签: c# generics

我在一堆数据模型上有一个抽象类,用于执行一些数据库更新/插入类型工作(将复杂结构 - 用户及其设置的部分 - 从一个数据库导入到另一个数据库)。

似乎我不能使用this对T中的项目进行任何工作。我原以为我可以这样做。相反,似乎我需要使方法静态并传入T类型的对象。

public abstract class AImportItemListDatabaseCalls<T, T2>
    where T : IImportListBase<T2>, IImportListDatabaseCalls<T2>
          where T2 : IImportItem
{


    public static bool ProcessListToDestination(T DataListModel, SqlConnection connection, SqlTransaction tran)
    {

        foreach (T2 item in DataListModel.ImportItems)
        {
            if (item.IsPaired) // Do, Do Not Insert work - different by T 
            {
                    if (!DataListModel.DestinationDoNotInsert(item, connection, tran))
                    {
                        //
                    }


            }
            else // Do, Insert work - different by T 
            {
                if (!DataListModel.DestinationInsertInto(item, connection, tran))
                {
                    //
                }
            }

        }

        return true;
    }
}

编辑:我想做什么

public abstract class AImportItemListDatabaseCalls<T, T2>
    where T : IImportListBase<T2>, IImportListDatabaseCalls<T2>
          where T2 : IImportItem
{


    public bool ProcessListToDestination( SqlConnection connection, SqlTransaction tran)
    {

        foreach (T2 item in ImportItems)
        {
            if (item.IsPaired) // Do, Do Not Insert work - different by T 
            {
                    if (!DestinationDoNotInsert(item, connection, tran))
                    {
                        //
                    }


            }
            else // Do, Insert work - different by T 
            {
                if (!DestinationInsertInto(item, connection, tran))
                {
                    //
                }
            }

        }

        return true;
    }
}

解决方案:

public abstract class AImportItemListDatabaseCalls< T2> : IImportListBase<T2>, IImportListDatabaseCalls<T2>
          where T2 : IImportItem
{

 public abstract List<T2> ImportItems { get; set; }
 public abstract bool DestinationInsertInto(T2 item, SqlConnection connection, SqlTransaction tran);
 public abstract bool DestinationDoNotInsert(T2 item, SqlConnection connection, SqlTransaction tran);
    public bool ProcessListToDestination( SqlConnection connection, SqlTransaction tran)
    {

        foreach (T2 item in ImportItems)
        {
            if (item.IsPaired) // Do, Do Not Insert work - different by T 
            {
                    if (!DestinationDoNotInsert(item, connection, tran))
                    {
                        //
                    }


            }
            else // Do, Insert work - different by T 
            {
                if (!DestinationInsertInto(item, connection, tran))
                {
                    //
                }
            }

        }

        return true;
    }
}

1 个答案:

答案 0 :(得分:2)

  
    

似乎我不能用这个。对T

中的项目进行任何处理   

当然不是。 T中有哪些项目? AImportItemListDatabaseCalls 不包含 T或T2。它只有那些可用的类型(不是那些类型的对象)。

你可能想做这样的事情:

public abstract class AImportItemListDatabaseCalls<T2> :
                           ImportListBase<T2>, IImportListDatabaseCalls<T2>
                      where T2 : IImportItem

现在有一个基于T2的基类。那么你可以使用this.