在C#中仅传递一个类型作为参数

Mar*_*ayo 113 c# parameters methods types

假设我这样做很方便:

foo.GetColumnValues(dm.mainColumn, int)
foo.GetColumnValues(dm.mainColumn, string)
Run Code Online (Sandbox Code Playgroud)

其中GetColumns方法将根据传递的类型调用其他方法.

是的,我可以做一个布尔标志或类似的东西,我只是想知道是否有办法可能通过这个,然后问:

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

我也可以覆盖方法,使用泛型等 - 我知道有不同的方法来做到这一点,我只是好奇,如果这是可能的.

Ree*_*sey 190

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

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

    if (type == typeof(int)) { // ...
Run Code Online (Sandbox Code Playgroud)

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

另一种选择是使用泛型:

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

这样做的好处是可以避免装箱并提供某种类型的安全性,并且会被称为: int val = GetColumnValue<int>(columnName);

  • @BadmintonCat`T Foo <T,U>(字符串arg1,U arg2)`或类似 (4认同)

Pet*_*hie 16

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

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

public void GetColumnValues<T>(object mainColumn)
{
    GetColumnValues(mainColumn, typeof(T));
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它:

foo.GetColumnValues<string>(dm.mainColumn);
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 11

您可以将类型作为参数传递,但为此,您必须使用typeof:

foo.GetColumnValues(dm.mainColumn, typeof(int))
Run Code Online (Sandbox Code Playgroud)

该方法需要接受带有类型的参数Type.


其中GetColumns方法将根据传递的类型调用其他方法.

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

foo.GetColumnValues<int>(dm.mainColumn)
Run Code Online (Sandbox Code Playgroud)

  • Upvote抵消downvote :) (3认同)

Dan*_*rod 8

foo.GetColumnValues(dm.mainColumn, typeof(int));
foo.GetColumnValues(dm.mainColumn, typeof(string));
Run Code Online (Sandbox Code Playgroud)

或者使用泛型:

foo.GetColumnValues<int>(dm.mainColumn);
foo.GetColumnValues<string>(dm.mainColumn);
Run Code Online (Sandbox Code Playgroud)

  • 我没有你,但可能是因为你正在展示如何调用它并且没有指定函数定义 (3认同)
  • 当人们需要勺子喂食时,我讨厌它.答案+对MSDN的简要阅读就足够了.我怀疑那些沮丧的选民正在回应竞争对手. (3认同)