2011-06-28 23 views
4

我在我的數據庫中有兩個不同的表,每個表都根據他們的「SortOrder」顯示給用戶。我寫了兩個函數,它們接受一行(或實體),並將它的排序順序與最接近它的排序順序(上或下,取決於正在執行的函數)進行交換。我需要使這些函數適用於兩個不同的表,這取決於事件發生的位置(具有相同功能的多個GridView)。這裏是我到目前爲止(再次,對於移動一個幾乎相同的功能,但我不會發表,因爲這將是多餘的):C# - 初始化一個變量而不知道它將會怎樣

protected void moveUp(String ValId, String dbName) 
    { 
     int ValueId = Convert.ToInt32(ValId); 
     DataModel.DataAccess.Entities dc = new DataModel.DataAccess.Entities(); 
     if (dbName.ToLower() == "table1") 
     { 
      DataModel.DataAccess.Table1 currentValue = dc.Table1.Single(table1item => table1item.Table1ItemId == ValueId); 
     } 
     else if (dbName.ToLower() == "table2") 
     { 
      DataModel.DataAccess.Table2 currentValue = dc.Table2.Single(table2item => table2item.Table2ItemId == ValueId); 
     } 
     try 
     { 
      //make the change and update the database and gridview 
     } 
     catch (InvalidOperationException) 
     { 
     } 
    } 

明顯的問題是,我需要在if語句之前啓動currentValue變量,否則存在它從未被聲明的「可能性」,因此該函數的其餘部分(使用currentValue變量)將不起作用。

我的問題是這樣的:我應該如何初始化變量之前 if語句,如果我不確定它會怎麼樣呢?我認爲這可能會奏效,但它說我還需要對它進行初始化(「隱式類型的局部變量必須初始化」):

var currentValue; //this is the line where I get the error message above 
    if (dbName.ToLower() == "table1") 
    { 
     currentValue = (DataModel.DataAccess.Table1)dc.Table1.Single(table1item => table1item.Table1ItemId == ValueId); 
    } 
    else if (dbName.ToLower() == "table2") 
    { 
     currentValue = (DataModel.DataAccess.Table2)dc.Table2.Single(table2item => table2item.Table2ItemId == ValueId); 
    } 

[編輯]改變了標題,使之更準確地反映我的問題

+0

我沒有製作數據模型。我只是將功能添加到已經建好的項目中。我對.net仍然很陌生,所以我的知識水平有限 –

+0

您的currentValue _Type_有問題,而不是值。只需重構你的代碼。 –

回答

7

在C#中,所有類型需要一個類型。如果您Table#類型擴展DataModel.DataAccess.Table,使用此:

DataModel.DataAccess.Table currentValue; 

否則,你就需要找到一個共同的基類(對象是所有這些偉大-鼻祖)。

object currentValue; 

既然你沒有初始化currentValue,編譯器不知道你的var意思類型。這就是你獲得例外的原因。

附錄:也許,強似在表的名稱,你可以使用一個通用的方法,如:

moveUp(dc.Table1, item => item.Table1Key, "george"); 

void moveUp<T> (IEnumerable<T> table, Func<T,string> keySelector, string ValId) 
{ 
    T currentValue = table.Single(item => keySelector(item) == ValueId); 

    try 
    { 
     //make the change and update the database and gridview 
    } 
    catch (InvalidOperationException) 
    { 
    } 
} 
+0

或者你可以做agent-j和我的組合,其中T是ISortableEntity,那麼你對實體的改變就會變得微不足道並被抽象化,這樣它們就可以被添加或改變,而不用改變這些函數。 – Jay

2

取代var,使用類型對象,儘管我可能會重寫這個整個過程並使用一致的(和標準)命名約定。

這樣:

object currentValue = null; 
+0

以這種方式,我無法引用變量的SortOrder屬性,無論它最終被轉換爲哪種類型,因爲object.SortOrder不存在。但這是我希望能夠做到的事情。 –

0

你不知道該變量的類型,這就是爲什麼你」重新聲明它('var',而不是'int')?

您不必初始化顯式類型 - 隱式類型需要它,因爲它們按給出的值計算出它們的類型。

2

您可以嘗試編寫每個實體使用的接口和接受該接口的函數。

public interface ISortableEntity 
{ 
    int ID { get; set; } 
    int SortOrder { get; set; } 
} 


public class DataFunctions 
{ 
    public static void MoveUp(string dbName, int valID) 
    { 
     var db = //Get your context here; 
     List<KeyValuePair<string, object>> keys = new List<KeyValuePair<string, object>>(); 
     keys.Add(new KeyValuePair<string, object>("ID", valID)); 

     ISortableEntity entity = db.GetObjectByKey(new System.Data.EntityKey(dbName, keys)) as ISortableEntity; 

     if (entity != null) 
     { 
      entity.SortOrder += 1; 
     } 

     db.SaveChanges(); 
    } 
} 
0

解決方案是接口。你的表1和表2類應該實現一個接口(比如ISortableTable或者任何你想調用它的)和一個屬性CurrentValue。Table1的CurrentValue屬性實現將返回Table1的正確結果,而Table2的CurrentValue屬性將返回Table2的正確結果。然後你的排序函數可以與任何實現ISortableInterface的類一起工作,並且可以處理相應對象的CurrentValue屬性。