2017-02-01 153 views
-2

我有兩個類,字段和FieldValues:字段如下:錯誤CS1729,我做錯了什麼?

enum FieldType 
{ 
    Boolean, 
    Integer, 
    String 
} 

class Fields 
{ 
    public FieldType type { get; set; } 
    public string name { get; set; } 

    public string GetFieldDeclaration() 
    { 
     switch (type) 
     { 
      case FieldType.Boolean: 
       return name + " tinyint(1)"; 
      case FieldType.Integer: 
       return name + " int"; 
      case FieldType.String: 
       return name + " varchar(2048)"; 
      default: 
       return string.Empty; 
     } 
    } 

和FieldValues:域

class FieldValues:Fields 
{ 
    public Dictionary<int, string> dictionary { get; set; } 

    FieldValues(FieldType newType, string newName) 
    { 
     type = newType; 
     name = newName; 
     dictionary = new Dictionary<int, string>(); 
    } 

這些類表示將從一個XLS被提取並插入到一些值數據庫。在主程序中,

List<Fields> tableFields = new List<Fields>() 
     { 
      new Fields() { name = "id", type = FieldType.Integer }, 
      new Fields() { name = "ECE", type = FieldType.Boolean }, 
      new Fields() { name = "TC", type = FieldType.Boolean }, 
      new Fields() { name = "Categories", type = FieldType.String }, 
     }; 



     string createQuery = "CREATE TABLE `poi_specs_mgu_ece_1.6` ("; 

     //creaza tabelul in functie de cate field-uri(coloane) sunt in lista 
     for(var i = 0; i < tableFields.Count; i++) 
     { 
      createQuery += "\n\t" + tableFields[i].GetFieldDeclaration() + (i == tableFields.Count - 1 ? string.Empty : ","); 
     } 
     createQuery += "\n);"; 

     //[WORK]create insert statement 

     List<FieldValues> fieldValues = new List<FieldValues>() 
     { 
      new FieldValues(tableFields[0]) { 
       dictionary = new Dictionary<int, string>() 
       { 
        {0, "test" }, 
        {1, "test" }, 
        {2, "test" }, 
        {3, "test" }, 
        {4, "test" }, 
        {5, "test" } 
       } 

      }, 
      new FieldValues(tableFields[1]) { 
       dictionary = new Dictionary<int, string>() 
       { 
        {0, "x" }, 
        {1, "x" }, 
        {2, " " }, 
        {3, "x" }, 
        {4, " " }, 
        {5, "x" } 
       } 

      }, 
      new FieldValues(tableFields[2]) { 
       dictionary = new Dictionary<int, string>() 
       { 
        {0, "x" }, 
        {1, "x" }, 
        {2, "x" }, 
        {3, "x" }, 
        {4, " " }, 
        {5, "x" } 
       } 

      }, 
      new FieldValues(tableFields[3]) { 
       dictionary = new Dictionary<int, string>() 
       { 
        {0, "Car" }, 
        {1, "Travel" }, 
        {2, "Stopping Possibilities" }, 
        {3, "Petrol Stations" }, 
        {4, "Rest Areas" }, 
        {5, "Travel" } 
       } 

      }, 
     }; 

     string createQuery2 = createQuery + "\n INSERT INTO `poi_specs_mgu_ece_1.6` ("; 

     for (var i = 0; i < tableFields.Count; i++) 
     { 
      createQuery2 += "\n\t" + tableFields[i].GetFieldDeclaration() + (i == tableFields.Count - 1 ? string.Empty : ","); 
     } 
     createQuery2 += ")\n VALUES ("; 



     for (var i = 0; i < fieldValues.Count; i++) 
     { 
      for (var j = 0; j < fieldValues[i].dictionary.Count; j++) 
      { 
       createQuery2 += "\n\t" + fieldValues[i].dictionary[j]; 
      } 
     } 
     createQuery2 += " \n);"; 
     File.WriteAllText("output.txt", createQuery2); 
     Console.WriteLine(createQuery2); 
     Console.ReadKey(); 

當編譯我收到以下錯誤:

Error CS1729 'FieldValues' does not contain a constructor that takes 1 arguments.

我真的不明白到底爲什麼從FieldValues我的構造並不在這裏工作。

+2

因爲你的構造函數有_two_參數'newType'和'newName',但只提供了一個。就像錯誤信息所述。 –

+0

「我不明白爲什麼我的FieldValues的構造函數在這裏不起作用」 - 它不工作,因爲它沒有被調用:) – Fildor

+0

另一個問題是你是否需要使構造函數(或一個構造函數重載)更容易訪問。它目前是私人的。例如,使用關鍵字「internal」使其可以從整個項目訪問。 –

回答

1

你的錯誤是在告訴你,你有一個構造函數聲明爲:

FieldValues(FieldType newType, string newName) 

並嘗試只用1個參數來調用它:

new FieldValues(tableFields[2]) 

可以重載構造與一個接受1個參數,或者當您調用它時需要提供第二個參數。

編輯:

一體化解決方案也可能是超載的構造與一個在那裏你可以通過爲參數Fields類型的變量。

class FieldValues:Fields 
{ 
    public Dictionary<int, string> dictionary { get; set; } 

    public FieldValues(FieldType newType, string newName) 
    { 
     type = newType; 
     name = newName; 
     dictionary = new Dictionary<int, string>(); 
    } 

    public FieldValues(Fields values) 
    { 
     type = values.type; 
     name = values.name; 
     dictionary = new Dictionary<int, string>(); 
    } 

然後你仍然可以自己分配字典。

List<FieldValues> fieldValues = new List<FieldValues>() 
{ 
    new FieldValues(tableFields[0]) { 
     dictionary = new Dictionary<int, string>() 
     { 
      {0, "test" }, 
      {1, "test" }, 
      {2, "test" }, 
      {3, "test" }, 
      {4, "test" }, 
      {5, "test" } 
     } 

    }, 

EDIT2:

正如我剛纔認可。重載將無法正常工作,因爲在你的文章中你的構造函數不是public!這是能夠從任何其他課程調用它的基本要素。我在回答中糾正了這個錯誤。

+0

yes,但tableFields [o]代表一個名字加一個類型。 '列表 tableFields =新列表() { 新的字段(){名稱= 「ID」,類型= FieldType.Integer}, 新字段(){名稱= 「ECE」,類型= FieldType.Boolean} , new Fields(){name =「TC」,type = FieldType.Boolean}, new Fields(){name =「Categories」,type = FieldType.String}, };' –

+0

@RăzvanBlanlan我做了一個編輯展示了一個構造函數重載的例子,它可以解決你的問題,並使代碼無需大的改動就可以工作。檢查出來 –

+0

重載構造函數就像你說的沒有工作。你能告訴我究竟該如何分配字典嗎? –

4

FieldValues類具有以下(非公開BTW)構造函數:

FieldValues(FieldType newType, string newName) 

但是你這樣稱呼它:

new FieldValues(tableFields[0]) 

因此錯誤。你可能意味着傳遞類型的支持,例如:

new FieldValues(FieldType.String, tableFields[0]) 

或添加其他的構造函數,意味着一個特定的類型,例如:

public FieldValues(string newName) 
{ 
    type = FieldType.String; 
    name = newName; 
    dictionary = new Dictionary<int, string>(); 
} 

或(如@JeppeStigNielsen指出)

public FieldValues(string newName) : this(FieldType.String, newName) 

或者您移動類型參數並使其成爲可選

public FieldValues(string newName, FieldType newType = FieldType.String) 

在附註中,"penis"在開發過程中不是一個好的佔位符文本,您可能會忘記帶出它(雙關語並非意圖)。我冒昧地在你的問題中用"test"代替它。

+0

額外的構造可以只_chain_舊的,如'內部FieldValues(串了newName):這個(FieldType.String,了newName){}'。 –

+0

@JeppeStigNielsen根據什麼他實際上試圖做的,這可能是做的最聰明的方式。 –

+0

我很抱歉「陰莖」的事情,我只是複製粘貼它沒有檢查它。 –

0

你FieldValues的構造函數有兩個參數,FieldType newType和S tring newName。你只用一個參數來調用它:new FieldValues(tableFields[0])

你想要的可能是:

new FieldValues(tableFields[0].Type, tableFields[0].Name) 
0

非常感謝您的支持。我重載構造這樣

public FieldValues(string newName) 
{ 
    type = FieldType.String; 
    name = newName; 
    dictionary = new Dictionary<int, string>(); 
} 

和字典部分這樣

new FieldValues(tableFields[0].ToString()) { 
        dictionary = new Dictionary<int, string>() 
        { 
         {0, "test" }, 
         {1, "test" }, 
         {2, "test" }, 
         {3, "test" }, 
         {4, "test" }, 
         {5, "test" } 
        } 

我知道這是小白的東西,但它幫助我,因爲我在C#中的新鮮首發。儘管如此,還是活着學習。

+0

我很高興聽到您已找到解決方案並學到了一些東西。你至少可以接受(或者升級)幫助你的答案之一。通過這個,你會把這個恩惠歸還給幫助你的人。 –