Передача только типа параметра в С#
Гипотетически мне было бы полезно сделать это:
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 для (возможно более эффективного) подхода.