【问题标题】:Sending DataType As An Argument?发送 DataType 作为参数?
【发布时间】:2011-08-03 07:04:40
【问题描述】:

我正在尝试编写一个使用以下两个参数的方法:

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. 

【问题讨论】:

  • 我们将提供比这更多的信息.​​.....你的方法是什么样的,你是如何调用代码的?
  • 请稍等我更新 OP。
  • 听起来你可能会使用泛型。像 YourFunc(object OtherCriticalArgument) 这样的东西。很想知道您的修订版是否适用。

标签: c# methods types


【解决方案1】:

您可以使用Type 作为参数类型。像这样

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

然后打电话

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

或

foo(d, typeof(Double));

【讨论】:

  • 啊,我明白了,你必须使用 typeof(TYPE) 传递它,我正在尝试 Type.TYPE(这显然不起作用)。谢谢! +1
  • 当我尝试使用 t 时,在“foo”内部,我得到:“找不到类型或命名空间名称 't'(您是否缺少 using 指令或程序集引用?)”。我的代码:(t)listView.Items[i].SubItems[columnToSort].Text,我正在尝试转换我的值。
  • 为了在运行时执行动态转换,由于在编译时无法知道转换类型(这就是您所描述的),您需要使用运行时反射。这里有一个答案(social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/…,第二篇文章)描述了如何实现这一点。
【解决方案2】:

您可以考虑使用泛型。

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

【讨论】:

    【解决方案3】:

    只需像这样传递对 Column 本身的引用:

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

    干杯, 中电联

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 2018-07-12
      • 2016-07-10
      • 2021-12-17
      相关资源
      最近更新 更多