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

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

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

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

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

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

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

Ответ 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<int>(columnName);

Ответ 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));

Или используя generics:

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

Ответ 5

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

foo.GetColumnValues(typeof(int))

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

Ответ 6

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