Как получить атрибуты из базового метода базового класса
От: MAMOHT  
Дата: 29.05.13 09:55
Оценка:
Добрый день.

Возможно ли в базовом классе получить какой-либо атрибут производного класса из статического метода?


    public class BaseClass
        public static string MyAttr
        {
            get{

            System.Attribute[] attrs = System.Attribute.GetCustomAttributes( ??????? );
            string res = "";
                foreach (System.Attribute attr in attrs )
                {
                    if (attr is MyAttrAttribute)
                    {
                        res = ((MyAttrAttribute) attr).Value;
                        break;
                    }
                }            
                
                if( res == "" )
                    throw new Exception("У класса нет аттрибута MyAttr");
                
                return res;
        }            
    }
}

    [MyAttr("123")]
    public class MyClass{
        ...
    }


    main()
    {
        Console.Write(MyClass.MyAttr); // должно вывести "123"
    }


Спасибо.
Re: Как получить атрибуты из базового метода базового класса
От: MAMOHT  
Дата: 29.05.13 09:57
Оценка:
Здравствуйте, MAMOHT, Вы писали:

MAM>Добрый день.


MAM>Возможно ли в базовом классе получить какой-либо атрибут производного класса из статического метода?


MAM> [MyAttr("123")]

MAM> public class MyClass{
MAM> ...
MAM> }


MAM> main()

MAM> {
MAM> Console.Write(MyClass.MyAttr); // должно вывести "123"
MAM> }
MAM>[/c#]


Ошибся, конечно же:

    [MyAttr("123")]
    public class MyClass: BaseClass{
        ...
    }
Re: Как получить атрибуты из базового метода базового класса
От: HowardLovekraft  
Дата: 29.05.13 10:44
Оценка:
Здравствуйте, MAMOHT, Вы писали:

MAM>Возможно ли в базовом классе получить какой-либо атрибут производного класса из статического метода?

Как это предполагается использовать?
Re[2]: Как получить атрибуты из базового метода базового класса
От: MAMOHT  
Дата: 29.05.13 12:25
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, MAMOHT, Вы писали:


MAM>>Возможно ли в базовом классе получить какой-либо атрибут производного класса из статического метода?

HL>Как это предполагается использовать?
Небольшая надстройка на PetaPOCO — микро-ORM.

Пока выкрутился так:
Если кто подскажет, как можно закэшировать результат — буду рад.

        /// <summary>
        /// имя таблицы БД
        /// </summary>
        public static string TableName
        {
            get{
                //ищем аттрибут TableName    
                //берем весь стэк вызовов                
                StackTrace st = new StackTrace(false);
                string tableName = "";
                for(int i = st.FrameCount - 1; i >= 0; i--) //перебираем от дочерних классов к базовым
                {
                    StackFrame frame = st.GetFrame(i);
                    MethodBase mi = frame.GetMethod();
                    Type declaringType = mi.DeclaringType;
    
                    System.Attribute[] attrs = System.Attribute.GetCustomAttributes( declaringType );
                    tableName = "";
                    foreach (System.Attribute attr in attrs )
                    {
                        if (attr is TableNameAttribute)
                        {//мы нашли нужный аттрибут
                            tableName = ((TableNameAttribute) attr).Value;
                            break;
                        }
                    }
                    if( tableName != "" )
                        break;
                }
                
                if( tableName == "" )                    
                    throw new Exception("У класса нет аттрибута TableName");
                
                return tableName;
            }        
        }
Re[3]: Как получить атрибуты из базового метода базового класса
От: HowardLovekraft  
Дата: 29.05.13 12:42
Оценка:
Здравствуйте, MAMOHT, Вы писали:

MAM>Небольшая надстройка на PetaPOCO — микро-ORM.

Это не объясняет контекст использования. Нужен пример, хотя бы псевдо-код, использующий эту фичу. Пока в голову приходит ответ "нельзя и не нужно".
Re[4]: Как получить атрибуты из базового метода базового класса
От: MAMOHT  
Дата: 29.05.13 12:56
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, MAMOHT, Вы писали:


MAM>>Небольшая надстройка на PetaPOCO — микро-ORM.

HL>Это не объясняет контекст использования. Нужен пример, хотя бы псевдо-код, использующий эту фичу. Пока в голову приходит ответ "нельзя и не нужно".

В ORM можно делать такие запросы:

var sql=PetaPoco.Sql.Builder()
            .Select("*")
            .From("articles")
            .Where("date_created < @0", DateTime.UtcNow)
            .OrderBy("date_created DESC");


И в тоже время есть атрибут "TableName" (как в BLToolkit)

Я хочу, чтобы имя таблицы упоминалось только один раз — в атрибуте класса модели.

//базовый класс модели
    public class ModelBase
    {
        public ModelBase()
        {
        }
        
        /// <summary>
        /// Возвращает готовый запрос вида select * from ....
        /// </summary>
        /// <returns></returns>
        public static Sql Select
        {
            get{
                return Sql.Builder
                    .Select("*")
                    .From(TableName);
            }
        }
        public static string TableName
        {
            get{.....}
        }
    }

//производный класс:
    [TableName("OKS.Project")]
    public class ProjectModel: ModelBase
    {
        public int RN{set;get;}
        public int Portfolio_RN{set;get;}    //идешник программы
        public string Numb{set;get;} //номер программы
        .....
    }

//все, имя таблицы больше нигде не упоминается
    Sql sql = ProjectModel.Select
        .Where("numb = " + aNumber.ToString());
    var q = db.Query<ProjectModel>(sql.SQL);
Re[5]: Как получить атрибуты из базового метода базового класса
От: HowardLovekraft  
Дата: 29.05.13 13:21
Оценка:
Здравствуйте, MAMOHT, Вы писали:

MAM>Я хочу, чтобы имя таблицы упоминалось только один раз — в атрибуте класса модели.

Напишите такой хэлпер:
    static class SqlFactory
    {
        public static Sql Select<T>()
        {
            var tableName = typeof(T).GetCustomAttributes(typeof(TableNameAttribute), false)[0].Value;

            return Sql.Builder
                .Select("*")
                .From(tableName);
        }
    }

Построение запроса:
            var sql = SqlFactory.Select<ProjectModel>()
                .Where("numb = " + aNumber.ToString());

Т.е. то же самое, но без извращений с определением типа.

P.S. Вообще, борьба с наличием имени таблицы в виде строкового литерала с учетом, например, строкового условия в Where, выглядит забавно.
Re[6]: Как получить атрибуты из базового метода базового класса
От: MAMOHT  
Дата: 29.05.13 13:57
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, MAMOHT, Вы писали:


HL>Напишите такой хэлпер:

HL>Построение запроса:
HL>Т.е. то же самое, но без извращений с определением типа.

Спасибо за идею, попробую так сделать.

HL>P.S. Вообще, борьба с наличием имени таблицы в виде строкового литерала с учетом, например, строкового условия в Where, выглядит забавно.


Не давите на мозоль , сам переживаю.
Но это потом, по мере накопления знаний.
Re[6]: Как получить атрибуты из базового метода базового класса
От: MAMOHT  
Дата: 29.05.13 14:00
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>P.S. Вообще, борьба с наличием имени таблицы в виде строкового литерала с учетом, например, строкового условия в Where, выглядит забавно.

Какие будут предложения? Кроме атрибутов на поля.
Re[7]: Как получить атрибуты из базового метода базового класса
От: HowardLovekraft  
Дата: 29.05.13 18:00
Оценка:
Здравствуйте, MAMOHT, Вы писали:

MAM>Какие будут предложения? Кроме атрибутов на поля.

Взять нормальный ORM. Не?
Эдак недолго написать свой LINQ-провайдер. Оно вам надо?
Re[8]: Как получить атрибуты из базового метода базового класса
От: MAMOHT  
Дата: 30.05.13 04:52
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, MAMOHT, Вы писали:


MAM>>Какие будут предложения? Кроме атрибутов на поля.

HL>Взять нормальный ORM. Не?
HL>Эдак недолго написать свой LINQ-провайдер. Оно вам надо?

Сейчас переписываю свой проект, в котором применялся BLToolkit. Красиво, конечно, но есть проблемы, в которых нет времени разбираться.
Re[9]: Как получить атрибуты из базового метода базового класса
От: igor-booch Россия  
Дата: 31.05.13 10:55
Оценка:
MAM>Сейчас переписываю свой проект, в котором применялся BLToolkit. Красиво, конечно, но есть проблемы, в которых нет времени разбираться.

Интересно, а какого рода проблемы?
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re: Как получить атрибуты из базового метода базового класса
От: TK Лес кывт.рф
Дата: 03.06.13 20:19
Оценка:
Здравствуйте, MAMOHT, Вы писали:

MAM>Добрый день.

MAM>Возможно ли в базовом классе получить какой-либо атрибут производного класса из статического метода?

Нарушений в пространственно-временном континууме не боитесь?

Взять текущий AppDomain, в нем получить список загруженных сборок, в сборках типы — их отфильтровать по базовому.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Как получить атрибуты из базового метода базового класса
От: Lloyd Россия  
Дата: 03.06.13 21:25
Оценка:
Здравствуйте, MAMOHT, Вы писали:

MAM>Возможно ли в базовом классе получить какой-либо атрибут производного класса из статического метода?



MAM>
MAM>    main()
MAM>    {
MAM>        Console.Write(MyClass.MyAttr); // должно вывести "123"
MAM>    }
MAM>


Такая запись, хоть и выглядит как обращение к члену MyClass, на самом деле является обращением к члену базового класса. Просто C# позволяет такие "вольности". На уровне MSIL-а все равно будет обращение BaseClass.MyAttr (можете проверить).
Поэтому именно в том виде, в котором вы это записали, это сделать не получится.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.