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


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

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

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

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

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

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

6   84   2012-06-09 00:20:26

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