LINUX.ORG.RU

Нужна консультация по C# в mono


0

1

Получилось так что возникла необходимость вносить правки в проект написанный под Mono на C#. Сам я на нем никогда не программировал, но несколько других языков знаю и на них большой опыт. Нужны консультации по специфическим для C# вещам. Кто нибудь может помочь?

Например, непонятен вот такой синтаксис:

[DbColumn (DataField.LotLocation)]

public string Location { get; set; }

По логике понятно, что в данном случае свойству объекта соответствует поле базы данных. Но непонятно из какого запроса берутся эти данные.

★★★

Последнее исправление: UncleAndy (всего исправлений: 4)

[DbColumn (DataField.LotLocation)]
public string Location { get; set; }

По логике понятно, что в данном случае свойству объекта соответствует поле базы данных. Но непонятно из какого запроса берутся эти данные.

эта конструкция:

public string Location { get; set; }

определаяет переменную с названием Location с аксессорами на чтение и запись, фактически можно развернуть эту сокращённую запись вот так:

private string _location;
public string Location
{
    get{return _location;}
    set{_location = value;}
}

это то что Вы спрашивали?

shty ★★★★★
()
Ответ на: комментарий от shty

Нет, меня больше интересует именно смысл конструкции в квадратных скобках которая находится над этой строкой.

UncleAndy ★★★
() автор топика
Ответ на: комментарий от UncleAndy

Нет, меня больше интересует именно смысл конструкции в квадратных скобках которая находится над этой строкой.

ну она просто задаёт биндинг

shty ★★★★★
()
[DbColumn (DataField.LotLocation)]

Эта конструкция «навешивает» пользовательский аттрибут DbColumn на свойство объекта Location. Затем, скорее всего, через рефлексию получаются аттрибуты всех свойств объекта и по ним генерируется запрос для загрузки/сохранения данных объектов в/из СУБД. Т.к. бегое гугление по DataField.LotLocation дает только ссылки на этот тред — похоже что используется самописаный ORM, и точный механизм работы этого дела нужно искать в коде проекта.

Sectoid ★★★★★
()
Ответ на: комментарий от Sectoid

Рефлексия - это уже что-то. Хотя-бы терминология прояснилась. Что происходит при рефлексии? DbColumn - это видимо тип данных, DataField.LotLocation - а это метод вызываемый для получения данных? Или не так?

UncleAndy ★★★
() автор топика
Ответ на: комментарий от UncleAndy

>Что происходит при рефлексии?

http://msdn.microsoft.com/en-us/library/f7ykdhsy(v=vs.80).aspx

DbColumn - это видимо тип данных,

Это тип. Поищи такой классец в проекте. Или DbColumnAttribute.

DataField.LotLocation - а это метод вызываемый для получения данных? Или не так?

Без понятия, говорю же — явно кастомный ORM используется, надо код смотреть.

Sectoid ★★★★★
()
Ответ на: комментарий от Sectoid

Что-то все запутывается еще больше. Есть вот такая реализация класса DbColumnAttribute:

    /// <summary>
    /// This is a Business Object DataBase Mepped Member attribute
    /// it is used to map certain business object field to a column in a database.
    /// </summary>

    [AttributeUsage (AttributeTargets.Property | AttributeTargets.Field)]
    public class DbColumnAttribute : Attribute
    {
        private readonly DbField dbField;

        public DbField DbField
        {
            get { return dbField; }
        }

        public DbColumnAttribute (DataField strongField)
        {
            dbField = new DbField (strongField);
        }

        public DbColumnAttribute (string field)
        {
            dbField = new DbField (field);
        }
    }

Тут еще один биндинг. 8(

UncleAndy ★★★
() автор топика
Ответ на: комментарий от UncleAndy
/// <summary>
/// This is a Business Object DataBase Mepped Member attribute
/// it is used to map certain business object field to a column in a database.
/// </summary>

Все тут нормально — вон даже написано для чего оно надо.

Теперь поищи место, где используется тип DbColumnAttribute. Причем имеется в виду не места, где он на свойства лепится, а где выгребаеются через рефлексию типы с этими аттрибутами)

Sectoid ★★★★★
()
Ответ на: комментарий от Sectoid

В общем, все крутиться вокруг DbColumnManager. В классе DataProvider есть вот такие функции:

        public static DbColumnManager [] GetDBManagers (Type objType)
        {
            List<DbColumnManager> boMembers = new List<DbColumnManager> ();

            foreach (PropertyInfo property in objType.GetProperties ()) {
                foreach (object attrib in property.GetCustomAttributes (true)) {
                    DbColumnAttribute boAttribute = attrib as DbColumnAttribute;
                    if (boAttribute == null)
                        continue;

                    boMembers.Add (new DbColumnManager (boAttribute.DbField, property));

                    break;
                }
            }

            return boMembers.ToArray ();
        }

        internal static DbColumnManager [] GetAllManagers (Type objType)
        {
            List<DbColumnManager> boMembers = new List<DbColumnManager> ();

            foreach (PropertyInfo property in objType.GetProperties ()) {
                DbColumnAttribute boAttribute = null;
                foreach (object attrib in property.GetCustomAttributes (true)) {
                    boAttribute = attrib as DbColumnAttribute;
                    if (boAttribute != null)
                        break;
                }

                boMembers.Add (new DbColumnManager (boAttribute != null ? boAttribute.DbField : null, property));

            }

            return boMembers.ToArray ();
        }
UncleAndy ★★★
() автор топика
Ответ на: комментарий от UncleAndy

> Что-то все запутывается еще больше. Есть вот такая реализация класса DbColumnAttribute:

DbColumn - это атрибут, и да, атрибут - это тоже тип. У него, как видно, два конструктора. DataField.LotLocation - это просто, видимо, статическое свойство типа string. То есть [DbColumn (DataField.LotLocation)] создает атрибут используя конструктор DbColumnAttribute (string field). Потом что-то, используя рефлексию, берет список атрибутов свойства и, находит DbColumn среди них, и затем берет из него DbField и что-то делает с ним.

[AttributeUsage (AttributeTargets.Property | AttributeTargets.Field)] - это атрибут на твой атрибут. Тут просто декларируется к чему этот (DbColumn) атрибут можно прикреплять.

smh ★★★
()
Ответ на: комментарий от smh

DataField.LotLocation - «LotLocation», фактически это имя поля в БД.

UncleAndy ★★★
() автор топика
Ответ на: комментарий от smh

Вообще, то что я пишу относится к софту WarehouseOpen для автоматизации скалдского и продажного учета. Исходники его вот тут можно взять при желании - http://www.microinvest.net/pub/WarehouseOpenSrc.zip

Буду благодарен если кто-то сможет подсказать последовательность работы с БД в нем. Например, если мне требуется при определенном действии взять данные из БД по определенному запросу и поместить их в поле формы. Пока я застрял на этапе «взять данные».

UncleAndy ★★★
() автор топика

> несколько других языков знаю и на них большой опыт

Неужто аннотаций в яве не видел?

ovk48 ★★★
()
Ответ на: комментарий от ovk48

С явой как раз не особо знаком. Знаю perl, php, C++, паскаль, JS.

UncleAndy ★★★
() автор топика
Ответ на: комментарий от aldayneko

Если-бы я еще понял что вы сказали. :(

UncleAndy ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.