|
Облом с переопределением метода статик в C# | ☑ | ||
---|---|---|---|---|
0
batmansoft
26.02.14
✎
23:34
|
Добрый день. Подскажите пожалуйста, в какую сторону посмотреть что бы решить вот такую проблему: Значит так, имеются несколько классов, поддерживающих определенный интерфейс. При помощи выборки из метаданных я составлю список этих типов, для того что бы дать пользователю выбрать из списка. Но проблема в том, что пользователю надо показать не название классов, а какие либо осмысленные названия. В C#, в отличии от 1С-ины, синонимов нет, поэтому я решил делать так: у предка всех этих классов объявить статический метод, который бы возвращал название класса "по русский". Но беда в том, что статический метод не может быть переопределен. Как быть, посоветуйте пожалуйста.
|
|||
1
jsmith82
26.02.14
✎
23:40
|
это после марша?
|
|||
2
jsmith82
26.02.14
✎
23:40
|
а пиндосы чо говорят. ты же в сша
|
|||
3
batmansoft
26.02.14
✎
23:41
|
(1) какого марша? (2) какие пиндосы, я в раше
|
|||
4
Jaap Vduul
26.02.14
✎
23:44
|
||||
5
Принт
26.02.14
✎
23:45
|
Или показывать родные имена классов, или явно задавать фрэндлинэйм. Остальное криво.
|
|||
6
b159263
26.02.14
✎
23:51
|
(0) "При помощи выборки из метаданных я составлю список этих типов" - это 1С имеется ввиду или рефлексия типов C#?
|
|||
7
shulerr
26.02.14
✎
23:52
|
Почему метод а не свойство? Ну то, которое с get/set
|
|||
8
batmansoft
26.02.14
✎
23:53
|
(6) Имеется в виду рефлексия типов
|
|||
9
batmansoft
26.02.14
✎
23:53
|
(4) Спасибо за ссылку, только пока не въезжаю, как это юзать
|
|||
10
batmansoft
26.02.14
✎
23:53
|
(7) И свойство пробовал. Один фиг.
|
|||
11
Jaap Vduul
26.02.14
✎
23:57
|
(9)
using System.ComponentModel; [DisplayName("Главное окошко")] public class MainWindow { public MainWindow() { MessageBox.Show(((DisplayNameAttribute)this.GetType().GetCustomAttributes(typeof(DisplayNameAttribute), true)[0]).DisplayName); } |
|||
12
b159263
26.02.14
✎
23:58
|
По ходу DisplayNameAttribute тебе не подойдет, она классы не обзывает.
Задает отображаемое имя свойства, события или открытого метода типа void, не принимающего аргументов. |
|||
13
Jaap Vduul
26.02.14
✎
23:58
|
(12)
[AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Method|AttributeTargets.Property|AttributeTargets.Event)] |
|||
14
b159263
27.02.14
✎
00:02
|
(13) ага сорри
|
|||
15
b159263
27.02.14
✎
00:03
|
(13) Ну вообще такую задачу можно решить и не только через данный атрибут, а например создав свой класс атрибута и обрабатывать его при выборе типа?
|
|||
16
batmansoft
27.02.14
✎
00:09
|
(13) спасибо, все отлично работает, если у кого то такая же задача, то вот образец кода:
Type[] tps = asm.GetTypes(); string s=""; foreach (Type tp in tps) { if (tp.GetInterface("ITradeSystem") != null) { string s1 = (tp.GetCustomAttributes(typeof(DisplayNameAttribute), true)[0] as DisplayNameAttribute).DisplayName; //s = s + tp.Name + "; "; s = s + s1 + "; "; } } |
|||
17
Jaap Vduul
27.02.14
✎
00:20
|
(15)
Разумеется: [System.AttributeUsage(System.AttributeTargets.Class)] public class FriendlyName : System.Attribute (16) Лучше сделать проверку на случай, когда GetCustomAttributes() возвращает пустой массив, иначе можно получить IndexOutOfRangeException (если вдруг у типа указанный атрибут отсутствует). |
|||
18
batmansoft
27.02.14
✎
23:04
|
(17) Спасибо
Подскажите, пожалуйста, еще, каким образом проверить на пустой массив? Делаю так: object[] obj = tp.GetCustomAttributes(typeof(DisplayNameAttribute), true); if (obj.Count > 0) { //[0] as DisplayNameAttribute).DisplayName; } подчеркивает obj.Count > 0 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |