Имя: Пароль:
IT
 
Облом с переопределением метода статик в 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
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.