【问题标题】:Passing just a type as a parameter in C#在 C# 中仅将类型作为参数传递
【发布时间】:2012-06-12 21:51:01
【问题描述】:

假设我这样做会很方便:

foo.GetColumnValues(dm.mainColumn, int)
foo.GetColumnValues(dm.mainColumn, string)

GetColumns 方法将根据传递的类型在其中调用不同的方法。

是的,我可以将其用作布尔标志或类似的,我只是想知道是否有办法通过这个,然后问:

typeof(arg[1]) 或类似...

我还可以覆盖该方法,使用泛型等 - 我知道有不同的方法可以做到这一点,我只是好奇这是否可行。

【问题讨论】:

  • 我的想法完全正确,这取决于 foo 实际上是什么。 foo.GetColumnValues<int>(dm.mainColumn) 可能是要走的路。
  • 正如我所说,我意识到还有其他方法可以做到这一点(布尔标志、泛型、覆盖方法)我只是想知道它是否可以作为参数。
  • @MarkMayo:我不明白这个问题,如果你 “知道你也可以重写方法、使用泛型等,而且你知道有不同的方法可以做到这一点,你只是好奇这是否可能”。所以你知道这一切,但你很好奇这是否可能??
  • @TimSchmelter - 以我描述的形式。即将它作为第二个参数传递。事实证明,Reed 有点说出了我所追求的 - 你在哪里使用(...,类型类型)。这就是我一直在寻找的。​​span>
  • 好问题,赞成,我看到 MS 使用 Type 作为 VB.NET 中内置运算符的参数,例如trycast,并且经常希望我可以自己在 C#/VB 中做到这一点——按照你描述的方式。

标签: c# types methods parameters


【解决方案1】:

有两种常见的方法。首先可以通过System.Type

object GetColumnValue(string columnName, Type type)
{
    // Here, you can check specific types, as needed:

    if (type == typeof(int)) { // ...

这将被称为:int val = (int)GetColumnValue(columnName, typeof(int));

另一种选择是使用泛型:

T GetColumnValue<T>(string columnName)
{
    // If you need the type, you can use typeof(T)...

这具有避免装箱并提供某种类型安全性的优点,并且将被称为:int val = GetColumnValue&lt;int&gt;(columnName);

【讨论】:

  • 你也可以做一个扩展方法,public static T GetColumnValue(this string columnName){...} 然后你可以说foo.GetColumnValues(dm.mainColumn)跨度>
  • 但是你如何定义一个有多个参数并且其中一个应该是泛型的方法呢?既然泛型是在方法参数列表之前定义的,那你怎么知道哪一个应该是泛型呢?
  • @BadmintonCat T Foo&lt;T,U&gt;(string arg1, U arg2) 或类似
  • 当使用第一种方法时,有没有办法为 type 分配一个默认值? (例如 object GetColumnValue(string columnName, Type type = object) 之类的东西?这对我来说似乎不太管用,但知道会很有用。
  • typeof() 是一个函数,它接受 int 或 char 之类的类型或某些类名。例如类型 c = typeof(char); .Net 没有为我们提供同样的特权。上面提到的 GetColumnValue 似乎是最好的。
【解决方案2】:

foo.GetColumnValues(dm.mainColumn, typeof(string))

或者,您可以使用通用方法:

public void GetColumnValues<T>(object mainColumn)
{
    GetColumnValues(mainColumn, typeof(T));
}

然后你可以像这样使用它:

foo.GetColumnValues<string>(dm.mainColumn);

【讨论】:

    【解决方案3】:

    您可以将类型作为参数传递,但要这样做,您必须使用typeof

    foo.GetColumnValues(dm.mainColumn, typeof(int))
    

    该方法需要接受 Type 类型的参数。


    GetColumns 方法将根据传递的类型在其中调用不同的方法。

    如果你想要这种行为,那么你不应该将类型作为参数传递,而是使用类型参数。

    foo.GetColumnValues<int>(dm.mainColumn)
    

    【讨论】:

      【解决方案4】:
      foo.GetColumnValues(dm.mainColumn, typeof(int));
      foo.GetColumnValues(dm.mainColumn, typeof(string));
      

      或者使用泛型:

      foo.GetColumnValues<int>(dm.mainColumn);
      foo.GetColumnValues<string>(dm.mainColumn);
      

      【讨论】:

      • 我没有告诉你,但可能是因为你展示了如何调用它并且没有指定函数定义
      • 我讨厌人们需要用勺子喂食。答案 + MSDN 的简短阅读就足够了。我怀疑那些反对的人是竞争代表的回答者——多么小气。
      【解决方案5】:

      你可以这样做,只需将它包裹在typeof()

      foo.GetColumnValues(typeof(int))
      
      public void GetColumnValues(Type type)
      {
          //logic
      }
      

      【讨论】:

        【解决方案6】:

        您可以使用类型类型的参数 - iow,传递 typeof(int)。您还可以将泛型用于(可能更有效的)方法。

        【讨论】:

          【解决方案7】:

          使用泛型类型!

            class DataExtraction<T>
          {
              DateRangeReport dateRange;
              List<Predicate> predicates;
              List<string> cids;
          
              public DataExtraction( DateRangeReport dateRange,
                                     List<Predicate> predicates,
                                     List<string> cids)            
          
              {
                  this.dateRange = dateRange;
                  this.predicates = predicates;
                  this.cids = cids;
              }
          }
          

          然后这样称呼它:

            DataExtraction<AdPerformanceRow> extractor = new DataExtraction<AdPerformanceRow>(dates, predicates , cids);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-04-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多