【问题标题】:Getting Errors when trying to create Generic Binding methods尝试创建通用绑定方法时出错
【发布时间】:2019-08-11 12:12:06
【问题描述】:

我有以下接口和类

public interface IOwner
{
    int Owner_pkid { get; set; }
    string Name { get; set; }
}

public class Owner : IOwner
{
    public Owner()
    {

    }

    public int Owner_pkid { get; set; }
    public string Name { get; set; }
}

然后我在一个单独的类中有以下数据访问方法

    public List<IOwner> GetAllOwners()
    {
        var sql = "SELECT owner_pkid, name from dbo.Owners ";

        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
        using (SqlCommand cmd = new SqlCommand(sql, conn))
        {
            cmd.CommandType = CommandType.Text;
            List<IOwner> owners = new List<IOwner>();
            conn.Open();

            using (SqlDataReader reader = cmd.ExecuteReader())
                BindResultSet<IOwner>(reader, owners);

            return owners;
        }
    }

    private void BindResultSet<T>(SqlDataReader reader, List<T> items) where T : new()
    {
        int counter = 0;

        if (!reader.IsClosed)
        {
            while (reader.Read())
            {
                T record = GetNextDataObject<T>(items, counter);
                counter++;
                BindRecord<T>(reader, record);
            }
        }
    }

    private T GetNextDataObject<T>(List<T> items, int pointer) where T : new()
    {
        if (pointer < items.Count)
        {
            return items[pointer];
        }
        else
        {
            items.Add(new T());
            return items[items.Count - 1];
        }
    }

    private void BindRecord<IOwner>(SqlDataReader reader, IOwner owner)
    {
        owner.Name = (string)reader["name"];
        owner.Owner_pkid = (int)reader["owner_pkid"];
    }

我在这段代码中遇到了 2 个单独的错误:

  1. 在 GetAllOwners 方法中,我在调用 BindResultSet 时遇到错误

IOwner 必须是具有无参数构造函数的非抽象类型才能在此处使用

我在实现类上有一个无参数的构造函数 - 不要认为我可以在接口中添加一个

  1. 在最终的 BindRecord 方法中,我收到一个错误,即无法识别两个属性名称。这可能是第一个问题的结果

【问题讨论】:

  • 您是否有多个继承自 IOwner 接口的类?我假设 BindResultSet 和 GetNextDataObject 可以与多个接口一起使用? (IFoo, IBar, ...)

标签: c# .net generics


【解决方案1】:

问题是你不能在界面上做新的。因此,T 为 Iowner 的“新 T”将不起作用。

有许多不同的方法可以解决此问题。最简洁的方法是添加一个工厂接口,其唯一目的是创建 IOwner 对象,比如 IOwnerFactory。在顶层实例化工厂并将其传递给需要创建对象的方法。

所以使用 item.Add(ownerFactory.Create()) 代替 item.Add(new T())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多