Возможно ли в базовом классе получить какой-либо атрибут производного класса из статического метода?
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, Вы писали:
MAM>Добрый день.
MAM>Возможно ли в базовом классе получить какой-либо атрибут производного класса из статического метода?
MAM> [MyAttr("123")] MAM> public class MyClass{ MAM> ... MAM> }
Здравствуйте, MAMOHT, Вы писали:
MAM>Возможно ли в базовом классе получить какой-либо атрибут производного класса из статического метода?
Как это предполагается использовать?
Re[2]: Как получить атрибуты из базового метода базового класса
Здравствуйте, 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]: Как получить атрибуты из базового метода базового класса
Здравствуйте, MAMOHT, Вы писали:
MAM>Небольшая надстройка на PetaPOCO — микро-ORM.
Это не объясняет контекст использования. Нужен пример, хотя бы псевдо-код, использующий эту фичу. Пока в голову приходит ответ "нельзя и не нужно".
Re[4]: Как получить атрибуты из базового метода базового класса
Здравствуйте, 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, Вы писали:
HL>Здравствуйте, MAMOHT, Вы писали:
HL>Напишите такой хэлпер: HL>Построение запроса: HL>Т.е. то же самое, но без извращений с определением типа.
Спасибо за идею, попробую так сделать.
HL>P.S. Вообще, борьба с наличием имени таблицы в виде строкового литерала с учетом, например, строкового условия в Where, выглядит забавно.
Не давите на мозоль , сам переживаю.
Но это потом, по мере накопления знаний.
Re[6]: Как получить атрибуты из базового метода базового класса
Здравствуйте, HowardLovekraft, Вы писали:
HL>P.S. Вообще, борьба с наличием имени таблицы в виде строкового литерала с учетом, например, строкового условия в Where, выглядит забавно.
Какие будут предложения? Кроме атрибутов на поля.
Re[7]: Как получить атрибуты из базового метода базового класса
Здравствуйте, MAMOHT, Вы писали:
MAM>Какие будут предложения? Кроме атрибутов на поля.
Взять нормальный ORM. Не?
Эдак недолго написать свой LINQ-провайдер. Оно вам надо?
Re[8]: Как получить атрибуты из базового метода базового класса
Здравствуйте, HowardLovekraft, Вы писали:
HL>Здравствуйте, MAMOHT, Вы писали:
MAM>>Какие будут предложения? Кроме атрибутов на поля. HL>Взять нормальный ORM. Не? HL>Эдак недолго написать свой LINQ-провайдер. Оно вам надо?
Сейчас переписываю свой проект, в котором применялся BLToolkit. Красиво, конечно, но есть проблемы, в которых нет времени разбираться.
Re[9]: Как получить атрибуты из базового метода базового класса
MAM>Сейчас переписываю свой проект, в котором применялся BLToolkit. Красиво, конечно, но есть проблемы, в которых нет времени разбираться.
Интересно, а какого рода проблемы?
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания http://rsdn.ru/Info/rules.xml
Re: Как получить атрибуты из базового метода базового класса
Здравствуйте, MAMOHT, Вы писали:
MAM>Добрый день. MAM>Возможно ли в базовом классе получить какой-либо атрибут производного класса из статического метода?
Нарушений в пространственно-временном континууме не боитесь?
Взять текущий AppDomain, в нем получить список загруженных сборок, в сборках типы — их отфильтровать по базовому.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Как получить атрибуты из базового метода базового класса
Такая запись, хоть и выглядит как обращение к члену MyClass, на самом деле является обращением к члену базового класса. Просто C# позволяет такие "вольности". На уровне MSIL-а все равно будет обращение BaseClass.MyAttr (можете проверить).
Поэтому именно в том виде, в котором вы это записали, это сделать не получится.