2011-04-11 151 views
5

我想要編寫使用以下兩個參數的方法:發送DataType作爲參數?

ColumnToSort 
ColumnType 

我希望能夠做到這一點的解釋兩件事情的原因作爲字符串可以給出不同的結果比較相同兩件事情作爲一個數字。例如

String: "10" < "2" 
Double: 10 > 2 

所以基本上,我希望能夠送雙倍或字符串數​​據類型作爲方法的參數,但我不知道如何做到這一點,但似乎喜歡的事,應該在C#中是可能的。

附錄:

我希望我的方法是什麼樣子:

InsertRow(customDataObj data, int columnToSort, DataType dataType){ 
    foreach(var row in listView){ 
     var value1 = (dataType)listView.Items[i].SubItems[columnToSort]; 
     var value2 = (dataType)data.Something; 
     //From here, it will find where the data object needs to be placed in the ListView and insert it 
    } 
} 

如何它會被稱爲:

I think the above provides enough of an explanation to understand how it will be called, if there are any specific questions, let me know. 
+0

我們要帶領一個比這更多的信息.​​. ..你的方法是什麼樣的,你怎麼調用代碼? – 2011-04-11 18:19:21

+0

給我一分鐘,我更新OP。 – sooprise 2011-04-11 18:20:01

+0

聽起來像你可能可以使用泛型。像YourFunc (對象OtherCriticalArgument)。好奇看到你的修改,如果這將適用。 – 2011-04-11 18:24:00

回答

6

可以使用Type作爲參數類型。這樣

void foo(object o, Type t) 
{ 
... 
} 

,並呼籲

Double d = 10.0; 
foo(d, d.GetType()); 

foo(d, typeof(Double)); 
+0

啊,我明白了,你必須使用typeof(TYPE)來傳遞它,我試着Type.TYPE(顯然不工作)。謝謝!+1 – sooprise 2011-04-11 18:25:31

+0

當我嘗試使用t時,在「foo」的內部,我得到:「無法找到類型或名稱空間名稱'(是否缺少using指令或程序集引用?」)。我的代碼:(t)listView.Items [i] .SubItems [columnToSort] .Text,我試圖施放我的價值。 – sooprise 2011-04-11 18:36:37

+0

爲了在運行時執行動態轉換,由於轉換類型在編譯時不能被知道(這就是你正在描述的),所以你需要使用運行時反射。這裏有一個答案(http://social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/fe14d396-bc35-4f98-851d-ce3c8663cd79,第二篇文章),它描述瞭如何實現這一點。 – 2011-04-13 23:44:38

1

這不是完全清楚你的目標是在這裏什麼,但Type型可能是你正在尋找:

void DoSomethingUseful(Type foo) 
{ 
    switch(typeof(foo)) 
    { 
     case typeof(string): 
      // something 
      break; 
     case typeof(double): 
      // something else 
      break; 
    } 
} 

DoSomethingUseful(fooObject.GetType()); 

Of cou rse我的方法名稱是誤導性的,因爲它幾乎是不可能的,所以有用,但希望這是你正在尋找的信息。

0

只是傳遞到柱本身的引用這樣的:

protected void DoSort(DataColumn dc) 
     { 
     string columnName = dc.ColumnName; 
     Type type = dc.DataType; 
     } 

乾杯, CEC

1

您可以考慮使用泛型。

InsertRow<T>(T data, int columnToSort){ 
    foreach(var row in listView){ 
     var value1 = (T)listView.Items[columnToSort].SubItems[columnToSort]; 
     var value2 = data; 
     //From here, it will find where the data object needs to be placed in the ListView and insert it 
     if(typeof(T)==typeof(string)) 
     { 
      //do with something wtih data 
     } 
     else if(typeof(T)==typeof(int)) 
     { 
      //do something else 
     } 
    } 
} 

然後調用它,讓它自己計算出類型。

int i=1; 
InsertRow(i,/*column/*); 

您可能還需要限制什麼T可以,例如,如果你想確保它的值類型,where T:structMore