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