Передача только типа в качестве параметра в C#

гипотетически мне было бы удобно сделать это:

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

где метод GetColumns вызовет другой метод внутри в зависимости от переданного типа.

Да, я мог бы сделать это как логический флаг или аналогичный, мне просто интересно, есть ли способ, возможно, пройти это, а затем спросить:

typeof(arg[1]) или аналогичный...

я также мог бы переопределить метод, использовать дженерики и т. д.-Я знаю, что есть разные способы сделать это, я был просто любопытно, возможно ли это.

6 ответов


существует два общих подхода. Во-первых, вы можете пройти 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<int>(columnName);


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

кроме того, вы можете использовать общий метод:

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

и вы могли бы использовать его как:

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

вы можете передать тип в качестве аргумента, но для этого вы должны использовать typeof:

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

метод должен будет принять параметр с типом Type.


где метод GetColumns вызовет другой метод внутри в зависимости от переданного типа.

если вы хотите это поведение, то вы не должны передавать тип в качестве аргумента, а вместо этого использовать параметр типа.

foo.GetColumnValues<int>(dm.mainColumn)

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

или использование дженериков:

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

Вы можете сделать это, просто оберните его в typeof()

foo.GetColumnValues(typeof(int))

public void GetColumnValues(Type type)
{
    //logic
}

вы можете использовать аргумент типа Type-iow, pass typeof(int). Вы также можете использовать дженерики для (возможно, более эффективного) подхода.