2011-04-11 111 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