Повторяемая логика для множества объектов - PullRequest
3 голосов
/ 16 сентября 2011

Итак, вот код:

return new DistrictInfo { 
    rid = Convert.ToUInt32(((OracleNumber)o.GetOracleValue("rid")).Value), 
    doc = Convert.ToUInt16(((OracleNumber)o.GetOracleValue("doctor")).Value), 
    secdoc = Convert.ToUInt16(((OracleNumber)o.GetOracleValue("secdoctor")).Value), 
    num = Convert.ToUInt16(((OracleNumber)o.GetOracleValue("num")).Value), 
    docname = o.GetOracleValue("doctorname") as string, 
    slpuname = o.GetOracleValue("lpuname") as string, 
    reason = o.GetOracleValue("reason") as string, 
    secdocname = o.GetOracleValue("secdocname") as string 
};

Теперь мне нужно переписать этот код, чтобы проверить, существует свойство объекта или нет. Это должно быть похоже на этот кусок кода:

DistrictInfo di;
if (!(o["rid"].Equals(DBNull.Value)) && !(o.GetOracleValue("rid").Equals(DBNull.Value)) && (((OracleNumber)o.GetOracleValue("rid")).Value != null))
{
    di.rid = Convert.ToUInt32(((OracleNumber)o.GetOracleValue("rid")).Value);
}

Но я нашел этот код немного неловким и не элегантным. Я сделал много проверок, потому что я хочу избежать исключений. Итак, вопрос в том, как мы можем реорганизовать этот код? Расскажи мне свои мысли. Я думаю, что нет необходимости в таком количестве проверок. Еще одна вещь, которую мы должны указать для различных имен объектов, чтобы сделать один блок кода для всех членов множества. Я думаю, что есть возможность использовать LINQ для этого. Также в первом куске кода мы видим различное приведение, поэтому нам нужно упомянуть об этом в нашем новом коде. Заранее спасибо, ребята!

P.S. Библиотека для работы с базой данных - это dotConnect for Oracle от devArt.

1 Ответ

2 голосов
/ 16 сентября 2011

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

So

string rawValue = o["rid"].ToString();
UInt32 parsedValue;
if (UInt32.TryParse(rawValue, out parsedValue))
{
    // was converted successfully
}
else
{
    // was not converted
}

Что касается автоматизации этого процесса для обработки нескольких свойств по их именам, вам также необходимо учитывать тип свойства, поэтому я не вижу хорошего способа использовать LINQ для этой цели.

РЕДАКТИРОВАТЬ: Добавлено предложение по автоматизации преобразования поля

Вы можете использовать Методы расширения функцию .NET для украшения типа OracleObject набором полезных методов.

public static class OracleObjectExtensions
{
    public static UInt32 GetUInt32Value(this OracleObject oracleObject, string fieldName)
    {
        UInt32 returnValue = default(UInt32);

        if (oracleObject[fieldName] != null)
        {
            string rawValue = oracleObject[fieldName].ToString();
            UInt32.TryParse(rawValue, out returnValue);                
        }

        return returnValue;
    }

    public static UInt16 GetUInt16Value(this OracleObject oracleObject, string fieldName)
    {
        UInt16 returnValue = default(UInt16);

        if (oracleObject[fieldName] != null)
        {
            string rawValue = oracleObject[fieldName].ToString();
            UInt16.TryParse(rawValue, out returnValue);
        }

        return returnValue;
    }
}

EDIT2: Методы расширения описание

Методы расширения позволяют вам «добавлять» методы к существующим типам. без создания нового производного типа, перекомпиляции или иным образом изменение исходного типа. Методы расширения являются особым видом статический метод, но они вызываются так, как если бы они были экземплярами расширенный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...