Возврат метода расширения с использованием обобщений - PullRequest
6 голосов
/ 09 января 2011

Можно ли вернуть универсальный тип, используя методы расширения ?

Например, у меня есть следующий метод:

// Convenience method to obtain a field within a row (as a double type) 
public static double GetDouble(this DataRow row, string field) {
    if (row != null && row.Table.Columns.Contains(field))
    {
        object value = row[field];
        if (value != null && value != DBNull.Value)
            return Convert.ToDouble(value);
    }
    return 0;
}

В настоящее время он используется следующим образом:

double value = row.GetDouble("tangible-equity");

, но я хотел бы использовать следующий код:

double value = row.Get<double>("tangible-equity");

Возможно ли это и если да, то как будет выглядеть метод?

Ответы [ 3 ]

12 голосов
/ 09 января 2011

Как насчет этого:

    public static T Get<T>(this DataRow row, string field) where T: IConvertible 
    {
        if (row != null && row.Table.Columns.Contains(field))
        {
            object value = row[field];
            if (value != null && value != DBNull.Value)
                return (T)Convert.ChangeType(value, typeof(T));
        }
        return default(T);
    }

Convert.ChangeType гораздо более гибкая обработка преобразований, чем просто приведение.Это в значительной степени отражает ваш оригинальный код, просто общий.

3 голосов
/ 09 января 2011

Это возможно.Это может быть что-то вроде следующего:

// Convenience method to obtain a field within a row (as a T type) 
public static T Get<T>(this DataRow row, string field) {
    if (row != null && row.Table.Columns.Contains(field))
    {
        object value = row[field];
        if (value != null && value != DBNull.Value)
            return (T)value;
    }
    return default(T);
}
1 голос
/ 09 января 2011

В DataRow есть метод расширения, называемый Поле , который будет делать очень многое из того, что вы пытаетесь сделать.Я не совсем уверен, как он будет вести себя с нулевым значением на двойном (я знаю, что он будет обрабатывать обнуляемые типы).Это может быть не совсем то, что вы ищете, но стоит посмотреть.

double value = row.Field<double>("tangible-equity");
...