Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Reflection и перегрузка свойств, override new 
V
    Опции темы
Piphon
Дата 11.3.2008, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 30.3.2004
Где: Екатеринбург

Репутация: нет
Всего: 2



Доброе время суток.

Код

    class ParentClass
    {
        public virtual int Property1
        {
            get { return 0; }
            set { ;}
        }
    }

    class ChildClass1 : ParentClass
    {
        public override int Property1
        {
            get { return base.Property1; }
            set { base.Property1 = value; }
        }
    }

    class ChildClass2 : ParentClass
    {
        public new virtual int Property1
        {
            get { return 0; }
            set { ;}
        }
    }

    class ChildClass3 : ParentClass
    {
        public new virtual string Property1
        {
            get { return string.Empty; }
            set { ;}
        }
    }


Надо узнать с помощью Reflection:
  • ChildClass1.Property1 это перегруженное свойство ParentClass.Property1
  • ChildClass2.Property1 и ChildClass3.Property1  это новые свойства и не имеют не какой связи со свойством ParentClass.Property1


--------------------
Non Progredi Est Regredi...
PM MAIL ICQ   Вверх
zaver
Дата 11.3.2008, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 15.8.2005

Репутация: нет
Всего: 3



а что известно;)?
PM MAIL WWW ICQ Skype YIM MSN   Вверх
eskaflone
  Дата 11.3.2008, 02:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 5.11.2005

Репутация: нет
Всего: 3



Код

class some
{
static void main()
{
    Type t = typeof(ChildClass1);
    PropertyInfo pi = t.GetProperty("Property1");

    Console.WriteLine(pi.Name + " " + pi.PropertyType);
}
}


Как понял твой вопрос так и ответил, пиши понятней что тебе надо.
PM MAIL   Вверх
Piphon
Дата 11.3.2008, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 30.3.2004
Где: Екатеринбург

Репутация: нет
Всего: 2



Цитата(zaver @  11.3.2008,  03:14 Найти цитируемый пост)
а что известно;)?

Известен только объект PropertyInfo.

eskaflone, лучше сформулировать не сумел :(

Код

        private static bool IsOverride(PropertyInfo prop)
        {
            MethodInfo method = prop.CanRead ? prop.GetGetMethod() : prop.GetSetMethod();
            MethodAttributes vtable  = method.Attributes & MethodAttributes.NewSlot;
            MethodAttributes virt = method.Attributes & MethodAttributes.Virtual;

            return  vtable != MethodAttributes.NewSlot && virt == MethodAttributes.Virtual;
        }


        static void Main(string[] args)
        {
            bool overClass1 = IsOverride(typeof(ChildClass1).GetProperty("Property1"));
            bool overClass2 = IsOverride(typeof(ChildClass2).GetProperty("Property1"));
            bool overClass3 = IsOverride(typeof(ChildClass3).GetProperty("Property1"));
        }

А это решение... Возвращает истину в том случае если свойство перегружено, и ложь если свойство новое.

Это сообщение отредактировал(а) Piphon - 12.3.2008, 19:10
--------------------
Non Progredi Est Regredi...
PM MAIL ICQ   Вверх
eskaflone
  Дата 12.3.2008, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 5.11.2005

Репутация: нет
Всего: 3



а если так:
Код

class MyClass1
{
public virtual int Property1
        {
            get { return 0; }
            set { ;}
        }
}

class MyClass2 : MyClass1
{
}

class MyClass3 : MyClass2
{
public override int Property1
        {
            get { return 1; }
            set { ;}
        }
}

}


Твой метод правильно определит?

Мне кажется надо копать в сторону PropertyInfo.GetOptionalCustomModifiers 
PM MAIL   Вверх
Piphon
Дата 12.3.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 30.3.2004
Где: Екатеринбург

Репутация: нет
Всего: 2



Возвращает истину.

Код для тестирования:
Код

    using System;
    using System.Reflection;

    class Program
    {
        static void Main(string[] args)
        {
            WriteInfo(typeof(MyClass3), "Property1");
            Console.ReadKey();
        }

        private static void WriteInfo(Type type, string name)
        {
            BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly;
            PropertyInfo prop = type.GetProperty(name, flags);
            if (prop == null) return;

            Console.WriteLine("Класс:          {0}", type);
            Console.WriteLine("Свойство:       {0}", prop);
            Console.WriteLine("Declaring Type: {0}", prop.DeclaringType);
            Console.WriteLine("Reflected Type: {0}", prop.ReflectedType);

            MethodInfo getter = prop.GetGetMethod(true);
            MethodInfo setter = prop.GetSetMethod(true);

            Console.WriteLine("Аттрибуты:      {0}", prop.Attributes);
            if (getter != null) 
                Console.WriteLine("Аттрибуты get:  {0}", getter.Attributes);
            if (setter != null) 
                Console.WriteLine("Аттрибуты set:  {0}", setter.Attributes);
            Console.WriteLine("Перегруженный:  {0}", IsOverride(prop));
            Console.WriteLine("Новый:          {0}", !IsOverride(prop));

            Console.WriteLine();
        }

        private static bool IsOverride(PropertyInfo prop)
        {
            MethodInfo method = prop.CanRead ? prop.GetGetMethod() : prop.GetSetMethod();
            MethodAttributes vtable  = method.Attributes & MethodAttributes.NewSlot;
            MethodAttributes virt = method.Attributes & MethodAttributes.Virtual;
            return  vtable != MethodAttributes.NewSlot && virt == MethodAttributes.Virtual;
        }
    }


Результат:
Код

    Класс:          MyClass3
    Свойство:       Int32 Property1
    Declaring Type: MyClass3
    Reflected Type: MyClass3
    Аттрибуты:      None
    Аттрибуты get:  PrivateScope, Public, Virtual, HideBySig, SpecialName
    Аттрибуты set:  PrivateScope, Public, Virtual, HideBySig, SpecialName
    Перегруженный:  True // что нам и надо было найти
    Новый:          False


Добавлено через 5 минут и 26 секунд
А на счет PropertyInfo.GetOptionalCustomModifiers() (а также PropertyInfo.GetRequiredCustomModifiers()), то здесь не все ясно. У меня они всегда возвращают пустой массив.
--------------------
Non Progredi Est Regredi...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0681 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.