簡體   English   中英

CBO.FillCollection拋出“沒有為此對象定義的無參數構造函數。”錯誤

[英]CBO.FillCollection throwing “No parameterless constructor defined for this object.” error

我正在嘗試從另一個方法返回的IDataReader中填充一個集合...由於某種原因,它不斷拋出“為此對象定義的無參數構造函數”。 此行的錯誤:

List<string> names = CBO.FillCollection<string>(DataProvider.Instance().ExecuteReader("getNames", new SqlParameter("UserId", 1)));

我已經嘗試分離出參數,所以事情會分開初始化,直到我有了這個:

List<string> names = CBO.FillCollection<string>(nameDataReader);

我在同一條線上仍然收到錯誤。

有任何想法嗎?

消息中的線索。 System.String沒有無參數構造函數,因此無法使用Activator.CreateInstance創建它,這通常用於動態創建對象。

編輯 :解決方案是直接使用閱讀器:

var strings = new List<string>();
using(var reader = DataProvider.Instance().ExecuteReader("getNames", new SqlParameter("UserId", 1)))
{
    while(reader.Read()) 
        strings.Add(reader[0] as string);
}

CBO.FillCollection似乎與值類型有關。

已經發布了更好的答案(直接訪問閱讀器),但要了解FillCollection方法正在尋找什么,您可以用以下方法解決您的問題:

添加一個新屬性,其屬性設置為SQL列名:

class StringRow { public string Name; } 

使用它傳遞給FillCollection,如:

List<string> stringCollection = new List<string>();
foreach (StringRow row in CBO.FillCollection<StringRow>(DataProvider...)) 
{
    stringCollection.Add(row.Name);
}

它想要一個具有命名屬性的對象,它可以反射設置。 因此,即使您正在檢索int列表, int對象也沒有“Name”屬性(從SQL返回集中的列中拉出)來設置,在這種情況下,它將返回0的列表。

不幸的是,使用int? 並將SQL返回列設置為[Value]並不能解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM